servlet串讲.doc_第1页
servlet串讲.doc_第2页
servlet串讲.doc_第3页
servlet串讲.doc_第4页
servlet串讲.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Servlet远程连接(mstsc)1. WEB三要素:客户端(我们通常认为它就是浏览器)服务器端:提供信息或服务给其它的机器,提供web内容给web浏览器通信的协议:HTTP(不够安全明码传输)、https(加密的安全的协议)2. C/S 与B/S3.什么是servlet?Java技术编写的运行在服务器上的来处理请求,响应客户端的多线程的程序。4. 安装tomcat配置CATALINA_HOME 和JAVA_HOME两个变量5. tomcat服务器下的一些目录6. WEB应用包含public和WEB-INF部分(不能被客户看到)7. servlet如何写二、servlet生命周期1.web容器我们把控制servlet生命周期的容器称为web容器(WEB Container),2.四个生命周期开始 初始化/实例化(一次) 服务(多次) 消亡(一次)覆盖父类的init(ServletConfig config) 要super.init(config);或者直接调用 init();理解模板模式解决并发:4.1避免使用实例变量;4.2在并发的地方加锁4.3 把servlet编程单线程的(早已经被抛弃了)只要是想 SingleThreadModel标记接口就可以了,5.修改taomcat的server.xml可以修改线程池的数目maxThreads的值6.获得请求中的参数getParameter :String 单值参数(单选按钮的值),如果用它获得多值参数就返回数组的第一个值getParameterValues:String 多值参数(复选框的值)getParameterMap:Map 参数名作为KEY,参数值作为VALUE,并且VALUE是个数组getParameterNames:Enumeration getQueryString 返回url中“?”后面的字符串用getParameterMap+ getParameterNames 和getParameterMap可以获得请求中所有参数复选框如果一个都不填那么在请求中不会有这个参数,但是其它的类型,不填时它们的值为空白三、servlet访问数据库使用数据库的缓存优点:提高性能,将Connection缓存起来,这就是数据库连接池,在池中养的是DataSource ,它的getConnnection()方法不需要任何参数,存放DataSource的规范就是JNDI服务;提前分配好客户使用的资源数目,不释放连接时不会影响到其它客户使用这个数据库;2.使用JNDI来访问数据库的资源(1)Tomcat 运行一个外部的WEB项目的时候将放到,E:apache-tomcat-6.0.18confCatalinalocalhost MyServlet.xml文件内(2)在Eclipse中建立了一个web项目时 直接在conf下context.xml中添加(3)在E:apache-tomcat-6.0.18confcontext.xml中添加2.如何使用到JNDI中的数据库资源呢?public static Connection getConnectionByJNDI() throws NamingException, SQLException Context context=new InitialContext(); DataSource ds= (DataSource) context.lookup(java:comp/env/jdbc/test); return ds.getConnection(); java:comp/env是规定要加上的,四、页面的跳转1. 重定向 Redirect,可以访问其它的应用程序,可以重定向到Internate上任何资源,重定向时地址栏时会变化,会产生一个新的请求,(淘宝支付货款)2. 转发 Forward,转发只能在当前的应用程序中转协同工作,还是同一个请求,地址栏上不会变化3.转发的步骤:(1)获得ServletContext(可以理解为Servlet运行环境描述成的一个对象)(2) 获得请求分发器(3) 再转发即:ServletContext context= getServletContext();RequestDispatcher dispatcher=context.getRequestDispatcher(“/要转发的应用的虚拟路径”);dispatcher.forward(request,response);或者dispatcher.include(request,response);4. 重定向的语法:response.SendRedirect(“/WEB应用名/虚拟路径”);JSP.01浏览器访问的是JSP由Tomcat服务器变成Servlet,可以把Jsp看成ServletJsp引擎:Tomcat服务器中一个把Jsp转化成Servlet的小工具 。Jsp隐含对象:Sun的标准规定的Jsp引擎生成的Servlet预先声明好的变量 (Jsp中不变的内容用脚本写,转化的时候直接加输出语句,会变得内容用引起来。转化时直接加进去。转化成Servlet的中间部分,Servlet的开头和结尾部分是现成的(但在Jsp中也可以设置),而且声明了一些对象(内建对象)。在Jsp中可以直接用JspWriter中PrintWriter人子类(内建对象不同服务器有不同的要求,介声明的内建对象的名字一样,与Sun公司比个数也不能少,可以增加。 OutJsp指令:写在Jsp文件中,指示Jsp引擎在生成Servlet的时候一些定制。 怎样在Jsp中加包, 要求Jsp引擎在开头加一些包,:例: 等价于 作用:封装引用五、Http状态管理1. HTTP事务的概述 (请求和响应的来回称为Htttp事务)HTTP事务是短连接的、stateless(无状态的),请求完成后就断开了再请求中的信息不会保存,不会保留用户的数据。每次请求响应都会建立新的连接,一旦请求响应做完了那么连接就完成了,用户的信息不会保存的,每个Http事务是独立的。2. Session(会话机制)相关的请求事务放在一个集合中,这个集合称为Session(会话),它能够跨请求共享数据。或者说Session是一个数据的集合,这些数据是由多个相关的请求产生的,这些数据存放的一块空间。HttpSession接口就代表了Session,它有这样一些方法:/void setAttribute(String name,Object value) Session.setAttribute(“date”,new Date(); /设置最大不活动时间,默认30分钟 Session.setMaxInactiveInterval(5) /5秒钟不用删除Session/Object getAttribute(String name)Object obj=session.getAttribute(“date”);void removeAttribute(String name)/让Session失效session.invalidate();4. Start or Join a Session/如果当前的请求信息中带有存储SessionID的Cookie,且该SessionID对应的Session对象存在则返回该对象否则该方法将创建新的Session对象并且将新的SessionID作为Cookie通过响应存到浏览器端HttpSession session=request.getSession(true);等同于HttpSession session=request.getSession();HttpSession session=request.getSession(false);true:如果没有拿到以前Session,那么就创建一个;如果有就返回那个Sessionfalse:如果没有拿到以前Session,那么就返回一个null;如果有就返回那个Sessiontrue确保有一个Session,5. 销毁SessionTOMCAT5.0之后的版本:Session的销毁与容器的关闭无关,session.invalidate();Timeout 设置超时时间,如果你长时间不用这个Session时,容器就会给你销毁掉设置超时有两种方式:一种是硬编码:session.setMaxInactiveInterval(10);/10秒,局部设置另外一种是在web.xml中加入下面的代码:注意这边单位是:分钟,全局设置 1六、跟踪Session技术1. 客户端会将Session信息保存下来,然后可以匹配Cookie是:把一些数据保存到客户端,也可以从客户端的Cookie中读取一些数据这个装置可以保存选择的信息,注册的信息等Cookie接口Cookie(String name,String value) /Cookie构造方法,只能保存字符串String getName()String getValue()void setMaxAge(int seconds) /设置Cookie的有效期 /0马上删除/0秒数3.Cookie APICookie c1=new Cookie(”som_cookie”,“1000”);/用来封装Cookie的信息name,valuecookie.setMaxAge(int s ); response.addCookie(c1); /生成响应头中的set-cookieCookie cookies=request.getCookies();/注意Null4注意事项编码问题:URLEncoder和URLDecoder值的大小和个数 :4K,20个Cookie的安全问题Path问题 5. Cookie放在浏览器的进程内存当中6.容器会自动将jsessionid种到一个Cookie,JSESSIONID=B2121DADA212121212127.Cookie的缺点:对于客户端来说,容易泄漏用户的隐私,对于服务端:客户端对于这些数据进行被伪造,Cookie 和 Session 是 用来解决Http无状态的,不同的是一个记录在客户端一个记录在服务器端。8.如果禁用了Cookie,我们可以根据URL重写来跟踪Sessionhttp:/localhost:8088/Servlet/day4/counter;jessionid=XXXXXXXXXX;跟踪Session的至少有两种方式:默认是Cookie来保存,或者是URL重写来跟踪Session;千万不要把SessionID写在日志上,不安全,为了安全的话只能启用Cookie另外不要手工的去加jsessionid,而使用response.encodeURL();例如: String url=”counter”;url=response.encodeURL(url);out.println(“refresh”);Cookie- 优惠卷Session- 商家那家的账本,但是你要带上你的会员卡SessionId-会员卡七、过滤器服务端的对象,在客户端和请求资源中间的一个对象,拦截请求又能拦截响应1. 过滤器能做什么?不直接服务客户端,不直接访问资源,拦截之后会对请求和响应做一些操作,改变请求和响应的头部信息记录日志认证(Authentication,有没有登陆过)和授权(authorization,是否有权限)拦截请求和响应执行通用操作,过滤器在不改变原有的资源内容的前提下扩展一些内容,2. Filter web应用在程序被加载的时候去实例化过滤器,如果过滤器被加载错误时你的整个web应用程序都会出错,有请求时执行过滤任务,FileterChain封装了过滤器执行的顺序。如果是最后一个Filter那么doFilter就会去执行那个Servlet3. 包装的作用自己写一个类去实现HttpServletResponse接口,有一个HttpServletResponse属性,再实现这个接口中的所有方法时,就用这个传过来的response实现那些方法,Servlet规范中有HttpServletResponseWrapper这样一个类就是做了我们上面的工作,ResourceBundle rb=ResourceBundle.getBundle(“”)/读取属性文件4. 在web.xml中可以有多个过滤器,执行顺序按照配置文件中的顺序执行。5. 要掌握字符编码和认证登陆过滤器八、监听器会在容器启动的时候被装载,能够监听到Servlet HttpSession ServletRequest三个对象的生命周期的装置,另外就是能监听这个对象的属性的生命周期,什么时候set、get、remove/Attribute我们可以控制Servlet和Filter的生命周期,1.javax.servlet.ServletContextListener接口监听容器(web应用程序)什么时候启动什么时候关闭,(常用)2. javax.servlet.ServletContextAttributeListener接口监听web应用程序中属性的创建、销毁、删除(用的很少)3.javax.servlet.HttpSessionListener接口监听Session的创建、销毁4.javax.servlet. HttpSessionAttributeListener接口监听web应用程序中属性的创建、销毁、删除(用的很少)5. javax.servlet.HttpSessionActivationListener接口 对象什么时候被钝化和激活,写日志时会用到,6. javax.servlet.HttpSessionBindingListener接口 监听对象被绑定的,比如一个USER对象被setAtrribute时javax.servlet.ServletRequestListener接口(记录用户日志)监听请求什么时候创建,销毁8. javax.servlet.ServletAttributeRequestListener接口九、1.使用ServletContext的log()用来记录日志文件2.我们可以打成war(web archive web归档文件)包命令:jar -cvf xxx.war web应用程序的名称部署war:将它扔到webapps下,访问时要用xxx是应用名称MVC(持久层,业务层,表现层)MVC在Web项目中的中具体应用JSP Model twoV JSP 显示结果,提交数据 C 控制器(Servlet): 1. 接收提交,处理请求(GET,POST) 2.调用M 3.选择JSP显示结果M 连接数据库,操作数据库,JavaBean(只有属性没有方法) 转发技术: /setAttribute(String ,Object)/Object.getAttribute(String)request.setAttribute(“user_list”,list)/ RequestDispatcher对象负责实现转发操作/参数为要转发的地址RequestDispatcher rd=request.getRequestDispatcher(“jsp/user_list.jsp”)/进行转发(把请求和响应对象转给另外一个组件) rd.forward(request,reponse)*.action 通配符String uri=request.getRequestURI()/ 返回字符串地址/取action 前的地址String path=uri.substirng(uri.lastIndexOf(“/”),uri.lastIndexOf(“.”)If(“/listUser”.equals(path) UserDao dao=new UserDao(); List list=dao.findAllUser;else if(“/addUser”.equals(path)解决庞大问题:用命令模式:写一个普通抽象类:写子类。/根据配置文件决定new哪个类Claza=Class forName(“someclass”)getPropties()配置xml文件 SAX:事件响应解析Dom:文档模型解析路径问题链接提交重定向: 一件事的结束是另一件事的开始转发: 两个组件干同一件事。 相对路径与其它相同,绝对路径不同 绝对路径从/应用名/ .jsp 不用写根目录因为转发不可能转到别的地方相对路径 Css和图片不能放在WebInfo下,绝对路径 : /(开头) /b/2.jsp /返回当前根目录名字带/JSP2.0EL 表达式$pageScope.msg$requestScope.msg$sessionScope.msg$applicationScope.msg$msg 从小到大依次搜索一遍,直到有对象 ,否则返回NullApplication.getAttribute() 共享范围最大 .setAttribute()pageContext 一个页面一个对象,共享范围最小,临时存放数据标记库JSTL.jar1. 2. helloTag extends simpleTagSupport um value doTog().3. Hello.tldNative2asciiJSP基本指令基本内建对象pageContextrequestresponsesessionapplicationoutEL表达式$1+2$requestScope.msg$sessionS$sessionScope.user.salary gt 10000JSTL标记库】无body 的taglib JavaScriptJavaScript操作HTMlJavaScript访问服务器(Ajax)JavaScript面向对象JavaScript框架(prototype.js jquery ) function f(a, b) var taskId = window.setInterval(function() /每隔1000毫秒执行function()中的代码一次,方法对象可作 alert(hello); , 1000); window.setTimeout(function() window.clearInterval(taskId);/5000后将刚才调用方法取消 , 5000); /用于处理集合JSONArray json = JSONArray.fromObject(userList);String jsonStr = json.toString();System.out.println(jsonStr);/处理单个对象User user = new User(300,whatisjava);JSONObject json1 = JSONObject.fromObject(user);System.out.println(json1.toString();function testAjax()var xmlHttpRequest = null;/初始化xmlHttpRequest对象 if (typeof XMLHttpRequest) != undefined) / FF xmlHttpRequest = new XMLHttpRequest(); else / IE xmlHttpRequest = new ActiveXObject(Microsoft.XMLHttp); /创建和服务器的连接 /arg0: get或post方式 /arg1: 要连接的地址 /arg2: 是否是异步的方式连接 var url = .; xmlHttpRequest.open(GET, url, true); / 给onreadystatechange属性赋值了一个函数 / 注册了一个状态监听器,当xmlHttpRequest的状态 / 一改变,该函数就调用 xmlHttpRequest.onreadystatechange = function() /xmlHttpRequest.readyState属性表示当前的状态码 if (xmlHttpRequest.readyState = 4) /responseText返回文本方式的响应内容 var resp = xmlHttpRequest.responseText; ; /向服务器发出请求! / xmlHttpRequest在和服务器交互的过程中 / 经历5个状态 / 0 连接还没有建立 / 1 连接已经建立,但是还没有发请求 / 2 请求已经发送 / 3 正在和服务器正交互 / 4 响应结束 / 每当状态发生改变的时候,就会调用 /onreadystatechange所指定的函数 xmlHttpRequest.send(null); /ForwardAction只负责返回Parameter转发的地址a target=blank/弹出新的窗口页面 Target=id /在 (id=)上覆盖想要显示的页面映射文件中写Sql 查询所有课程Prototype.js New Ajax.Request(“url” / request向url发出异步请求 Method:get onSuccess:function(resp) /响应成功之后调用的方法 );空链接: List.set(0,list.set(2.list.get(0);/2与0位置交换/追加条件查询Session session = HibernateSessionFactory.openSession();Criteria criteria = session.createCriteria(Book.class);if (categoryId != null)criteria.add(Restrictions.like(categoryValue, %/+ String.valueOf(categoryId) + /%);if (name != null)criteria.add(Restrictions.like(name, % + name + %);if (author != null)criteria.add(Restrictions.like(author, % + author + %);if (publisher != null)criteria.add(Restrictions.like(publisher, % + publisher + %);List list = criteria.list();session.close();EL扩展:1class static 2tld 3taglib $f:len()Struts 扩展:validate=”true” input=” /验证失败转到input地址ValidateForm 父类,validation.xml中form name=”/地址“而 ValidateActionForm 子类 form name=”/form 的 name”ActionForm: 重写ActionErrors方法restfill. ActionErrors validate() ActionErrors error=new ActionErrors(); error.add(“”,new ActionMessage(“”) return error; 常见Form Html 标记库:可缓存 Action扩展:一个Action实现多个功能someAction extends DispatchAction public ActionForward f() public ActionForward g() 配置文件合并:path=”/some” type=” parameter=”option” 调用f: some.do?option=f 调用g:some.do?option=g 配置文件分开:path=”/other”type=”parameter=”f” Path=”/other” type=” parameter=”g”Public DispatchAction extends Action private Map map = Collections.synchronizedMap(new HashMap(); Public ActionForward execute() String param=mapping.getParameter(); /得到option属性String methodName=request.getParameter(param);/得到方法名Mehtod method=()map.get(methodName) /反射过程慢,用Map优化If(method=null)Class clazz=this.getClass(); / 反射对方法区编程method=Clazz.getMethod(methodName,new ClassActionMapping.class,ActionForm.class,HttpServletRequest,HttpServletResponse response)ActionForward forward=(ActionForward)method .invoke(this,new Objectmapping,form,request,response) map.put(methodName,method); Return forward;日志记录:log4j定义日志追加器:log4j.appender.(名字)console=日志的功能 Log4j.appender.console.layout= console的格式 Log4j.appender.console.layout.ConversionPattern=%d-%p %c:%L-%m%n 具体格式类型 %d 时间类型 可追加 yyyy mm %m 输出的信息 %n 换行#debug info warn error fatal L.whatisjava=*,console org.whatisjava下的所有类在console里输出,*可指定以上五种类型ActionMessages errors=new ActionMessages() errors.add(“abc”,new ActionMessages(“error.verif.user”)this.saveErrors(request,errors);ActionErrorsBeanUtils .copyProperties( , )异步asynchronous=false,Select EmpSelect form Emp empSelect emp.id, from Emp empSelect new Emp(emp.id,)from Emp empStruts2 (优点:扩展性强, 拦截器)Jasper report 开元报表程序 . .jasper.jrxml 编译 填充.jrprinttnt 导出 Excel PDF HtmlJSONPlugin JSON(serialize=false) 标注下的属性不参加序列化JSON(name=”list”)可以把变量名改变,若不写则与属性名相同页面模板includetilesrequest.getAttributeNames(); 将request中所有的键值队拿出来 struts2数据 放在Context 里ActionContext ctx=ActionContext.getContext();Value Stack=ctx.getValueStack();Stack.findValue() 根据键去找值Struts2配置文件写法:/WEB-INF/jsp/form.jsp image/jpginput /WEB-INF/jsp/1.jsp拦截器:(interceptor)AOP:把新代码加到正在运行的代码中去Proxy:根据Ponintcut将advice加入到target中去Ponitcut :切入点Java 服务器端组件Http协议:1Get请求 : 如何传递数据,通过地址中的请求参数 1)数据量小 2)文本 2Post请求: 协议头信息可以通过Request对象的相应方法获得

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论