




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA笔记一、 Servlet1)、实现Servlet接口后就可以重写接口中的方法(int、service、 destroy),从这三个方法即可看出servlet的生命周期,当一个servlet开始运行时,int方法最先被执行,但只执行一次,其次是service,可能会执行多次,由servlet容器调用,请求一次调用一次,destroy方法也只是在servlet消亡时执行一次。代码示例public void init(ServletConfig arg0) throws ServletException /ServletConfig是接口,由tamcat服务器开发者实现init方法调用时,传过来的实际上是StandardWrapperFacde对象(可以打印ServletConfig看出),底层代码是:Public final class StandardWrapperFacde implements ServletConfig,此对象中封装了servlet的初始化信息,如:servletConfig.getServletName( );servletConfig.getServletContext();获取上下文对象等public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException/req中封装了客户端传递过来的所有信息,res中封转了服务器端要传给客户端的所有信息/向下转型为HttpServletRequest,HttpServletResponse可以获取更多功能HttpServletRequest request= (HttpServletRequest)req;HttpServletResponse response (HttpServletResponse)res;PrintWriter out=response.getWriter();public void destroy()public ServletConfig getServletConfig()return null;public String getServletInfo()return null;2)、Servlet映射在servlet配置中,中的有3种配置方法a、/showcar即配置具体的路径b、*.doc、/*d、同一个servlet也可以配置多个,则此时这个servlet有多个访问路径3)缺省servlet当配置为/时,此servlet为当前服务器的缺省servlet,凡在web.xml中找不到匹配的元素的URL,它们的请求访问就会交给此缺省servlet处理,在tamcat的conf文件夹的web.xml中注册了一个org.apache.catalina.servlets.DefaultServlet default org.apache.catalina.servlets.DefaultServlet debug 0 listings false 1 default / 由此我们可以看出此servlet的功能,当访问服务器中的某个图片或静态HTML时,实际上就访问这个servlet4),GenericServlet类public class ServletTest extends GenericServletpublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOExceptiona、继承GenericServlet类后,观察底层代码只有service方法是抽象方法,所以只需覆盖service即可b、可通过此方法获取ServletConfigServletConfig servletconfig=this.getServletConfig();servletconfig.getInitParameter();或直接this.getInitParameter();(被底层封装简化了)注意:此时若想初始化参数,最好调用无参的init方法,若调用有参的方法,则会影响service的ServletConfig servletconfig=this.getServletConfig();servletconfig.getInitParameter();执行,因为若想通过getServletConfig()获取ServletConfig,前提是父类的config成员变量必须被赋值,否则取到的空值底层代码如下,在父类的有参init方法中,config成员变量被赋值了。如果重写了父类的有参init方法而没有对父类的config成员变量进行赋值,则只能获取空值。(知识补充:子类可以通过父类的公有方法来获取父类的私有方法,子类的实现必须先调用父类的无参构造方法,所以当父类没有无参构造方法时,必须在子类中显式调用父类的构造方法)所以在开发中需要用到初始化时,建议调用无参的init方法5)、HttpServlet/*先执行有参的init()方法* 然后执行service(ServletRequest req, ServletResponse resp)方法会调用service(HttpServletRequest req, HttpServletResponse resp)方法,然后service(HttpServletRequest req, HttpServletResponse resp)根据表单提交的不同方式来调用doPost,或者doGet方法*/所以我们可以看到,如果重写了父类的service方法,则父类就不会通过原service方法来通过请求的不同去调用doGet或doPost方法由上述执行过程可知,我们不能重写父类的service(HttpServletRequest req, HttpServletResponse resp)方法,重写之后doGet和doPost方法就没用了。必须要重写时要显式调用父类的service方法,一般只用到doGet和doPost方法a、 解决post中文乱码问题,tomcat默认编码是ISO-8859-1request.setCharacterEncoding(“utf-8”);response.setContentType(“text/html;charset=utf-8”);这两句须放在request对象使用之前,但此方法对GET请求无效b、 表单提交数据时,传到服务器端的是通过表单的name属性,与其id无关c、 常用接收表单传过来的值方法,示例String password=request.getParameter(password);String str=request.getParameterValues();Map map=request.getParameterMap();获取特定表头信息String accept=req.getHeader(Accept);写字符串到浏览器上去resp.getWriter().write(dfdsff);等等d、 表单提交时,如果用GET方法,表单中的同属性的值会覆盖url路径中的值。如果用post方式,表单中的值会作为正文传递,路径后的值会作为参数传递,所以会出现两个值。二、 Cookie1、 Cookie小结:2、cookie的具体部分操作:a、 创建cookie,使用HttpServletResponse对象Cookie c=newCookie(bookHistory,“book1”);c.setMaxAge(1*24*60*60);response.addCookie(c);注意要设置cookie的存活时间,否则cookie只是临时存在b、 获取cookieCookie c=request.getCookies();if(c!=null)for(Cookie cc:c)if (cc.getName().equals(bookHistory)return cc.getValue();三、 session1、该客户端在服务器端对应的HttpSession:HttpSession session=request.getSession();2、ession中存入信息:session.setAttribute(shopcar, list);3、应的HttpSession中取得相应的信息:List list=(List) session.getAttribute(shopcar);4、*1 session的消毁 a)session在默认情况下,web服务器只给每个HttpSession30分钟的生命周期 b)可以通过在web.xml文件中通过以下代码配置HttpSession的生命周期,单位分 1 c)HttpSession的销毁是由web服务器来完成,但通常Web服务器的销毁不精准,会有延时 d)HttpSession的销毁!=HttpSession为空 e)HttpSession也可以通过手工销毁,代码如下:session.invalidate(); f)不论通过何种方式销毁,该HttpSession非空,但其中的内容都没有了5、避免session的重复提交登陆后及时删除原session说明,使用URL重写后,服务器会判断浏览器是否禁用了Cookie,如果cookie未被禁用,则还是按照正常方法来使用。若Cookie被禁用了,则URL重写方法会把seesion中的信息通过超链接把值传过来,此时注意观察浏览器地址栏的变化即可知道。Rsponse.encodeRedirectURL方法可对sendRedirect方法后的url地址进行重写。Rsponse.encodeURL方法可对一般的连接进行重写四、 sessionContext总结:*2 ServletContext对象 a)每一个Web应用对应一个ServletContext对象,即Context域对象 b)在Servlet中,一共有三个域对象,Request域对象,Session域对象,Context域对象 c)Context域对象是供整个当前Web应用中的所有动态资源Servlet/Jsp共享 d)使用传统方式加载资源文件,是相对于tomcat/bin/目录而言 e)使用ServletContext方式加载资源文件, 3 关于路径的问题 a)通过ServletContext加载文件,该文件的路径一定要要tomcat中的路径,而不是IDE工具中的路径 b)其中/表示当前web应用名,即day07 c)通过类加载器加载资源文件,其中/表示WEB-INF/classes/目录 比较三种加载资源文件的特点: a)传统 对于中大型敏感项目不能使用 b)ServletContext 资源文件的放置位置任意 文件不管多大,不会一次性加载到内存中,而以IO二进制流的方式读取 /表示当前web应用名,即day07 c)类加载器 资源文件的放置位置,只能类路径下 文件不管多大,都会一次性加载到内存中 /表示WEB-INF/classes/这个目录 项目中,建议不要使用./或./*4 缓存应用 a)刷新,不论浏览器缓存中是否有对应的资源,都找服务器要资源 b)回车或超链接访问,就是先在缓存中找,如果找到了,就将缓存中的内容取出;如果缓存中没有,找服务器要 c)如果覆写Servlet的getLastModified()方法让其返回不是-1,就不会执行doGet或doPost方法。设置缓存的时间,单位毫秒通过判断文件是否被修改过,来确定是否要向服务器获取资源左侧为简写的底层代码,当客户端的缓存不存在或比服务器端的缓存旧时,就调用doGet或doPost方法,若二者的一样就直接调用缓存。*8 转发和重定向 a)通过request对象能够实现转发,转发过程中,各个request对象是一致的 b)转发是服务端内容的行为,外界看不见,地址栏不变,可以共享同一个requeset域对象 c)转发是通过request对象发起的,其中/表示当前web应用,即day07 d)重定向是通过response对象发起的,其中/表示webapps目录 e)重定向是服务端与浏览器的行为,外界看得见,地址栏变化,不可以共享同一个requeset域对象 f)在定重向情况下,可以共享HttpSession或ServletContext对象 g)重定向可以在不同的web应用中跳转,转发只能在当前web应用中跳转五,请求转发的细节问题例:如果在上述例子中的Demo92中不用设置响应的编码,运行Demo91转发到Demo92可以输出中文“哈哈”,这是因为已写入到HttpServletResponse对象中的响应头字段信息保持有效。在Demo92中设置了不同的编码会覆盖Demo91中的编码。六、includeinclude类似于函数调用 在包含过程,包含Servlet的响应头为主,被包函的Servlet响应头会被忽略七、jsp*3 JSP工作原理 每一个合法的jsp页面,都会被Web服务器翻译成Servlet的,其命名规则是:date.jsp-date_jsp.java 翻译后的Servlet与Servlet的生命生期一致 a)Web服务器是如何调用并执行一个jsp页面的? 1)根据用户的合法请求,Web服务端判段是哪种资源,如果是JSP的话,交由JSP引擎;如果是Servlet,交由Servlet引擎 2)如果是一个JSP资源的话,Web服务器会将JSP按照规范翻译成Servlet,并传入JSP内置对象 3)JSP引擎将翻译后的Servlet交由Servlet引擎处理 4)Servlet引擎将其放入Servlet缓冲区,以便重用 5)如果再次访问原JSP页面,当内容没有改变的情况下,此时直接调用Servlet缓冲区中的Servlet为你服务 6)如果再次访问原JSP页面,当内容改变的情况下,JSP引擎又会再一次翻译该JSP 7)其实JSP本质上是一个Servlet b)Jsp页面中的html排版标签是如何被发送到客户端的? out.write(静态代码) c)Jsp页面中的java代码服务器是如何执行的? out.print(动态代码) d)Web服务器在调用jsp时,会给jsp提供一些什么java对象? 这些对象如下: PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; *4 JSP语法 1)JSP模版元素 HTML面页中的标签,例如:,.,它构成JSP的骨架 2)JSP表达式 对于JSP表达式不能使用;分号结束 3)JSP脚本片断 对于JSP脚本使用,以分号结束 多个脚本片段中的变量可以共享,因为该变量是位于_jspService()中的局部变量 4)JSP声明 对于JSP声明,使用所有声明的变量,都会被翻译成Servlet的实例变量,即全局变量5)、jsp页面出错后就不会被翻译成class文件6)jsp语法4)JSP声明 对于JSP声明,使用 所有声明的变量,都会被翻译成Servlet的实例变量 ,在其中也可以定义一个方法,但在其他地方不可以,因为java方法里不能再定义方法,查看被翻译成的jsp_java代码即可知道。 5)JSP注释 JSP注释为 对于JSP页面,直接使用JSP特有的注释 JSP特有注释不能嵌套 原则上进,每3-5行,写一行注释,在JSP项目中尽可能使用JSP特有注释。因为,Web容器在翻译成Servlet时,会忽略JSP特有注释,其它注释会当作有效内容被翻入到Servlet中 6)JSP指令 指示JSP引擎的工作 有些指令的属性可以写N次,但有些只有写1次,例如:pageEncoding只能写1次,但import可以写N次 有三类:a)page指令language=java表示JSP脚本中使用的语法规则,默认java*import=java.util.*表示该JSP页面中导入的相关包,默认java.lang.*,javax.servlet.*,javax.servlet.http.*session=true/false,表示用户访问任意jsp时,web服务器在默认情况下,会自动产生HttpSession,默认为truefales表现当用户访问jsp时,web服务器不会产生HttpSessionbuffer=none/8kb/sizekb表示JSP页面和浏览器之间存在的缓存大小,不是越大越好,默认8kbautoFlush=true/false表示当缓存满时,web服务器是否自动刷新缓存,默认是true,false表示需要程序员通过代码方式刷新缓存isThreadSafe=true/false表示在多线程访问某个JSP中的变量时,web服务器自动确保该变量的安全,默认true,如果选择false,则程序员在程序自行加锁来确保变量线程安全info=xxxxx表示该jsp面页的信息,可以通过Servlet.getServletInfo()来取到这个信息*isErroPage=*errorPage=contentType=text/html;charset=UTF-8表示回显到浏览器,采用的类型和编码方式,默认text/html;charset=ISO8859-1*pageEncoding=表示当前JSP页面采用的编码方式,默认ISO8859-1*isELIgnored=true/false表示当前JSP引擎是否支持EL语法,true表示支持,false表示不支持,在不同的web服务器,默认方式不一致,tomcat6默认true.jsp与servlet一样,也存在输入和输出的中文乱码问题,问题方案如下:a)输入:b)输出:类似于response.setContentType(text/html;charset=UTF-8);c)在JSP引擎将JSP翻译成Servlet原码时,JSP中的中文,默认采用UTF-8编码1、pageEncoding=UTF-8的作用是设置JSP编译成Servlet时使用的编码。众所周知,JSP在服务 器上是要先被编译成Servlet的。pageEncoding=UTF-8的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的 编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的 JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding=UTF-8,就会引起JSP内部定义的字符串为乱码。 另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码。2、contentType=text/html;charset=UTF-8的作用是指定对服务器响应进行重新编码的编码。 在不使response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。3、request.setCharacterEncoding(UTF-8)的作用是设置对客户端请求进行重新编码的编码。该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。4、response.setCharacterEncoding(UTF-8)的作用是指定对服务器响应进行重新编码的编码。 服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。对于发送数据,服务器按照response.setCharacterEncodingcontentTypepageEncoding的优先顺序,对要发送的数据进行编码。但设置JSP源文件字符集时,优先级为 pageEncoding contentType.都没有设置,默认ISO-8859-1.验证办法:可以将jsp页面的pageEncoding和response.setCharacterEncoding、contentType等设置不同的编码,运行jsp页面查看中文显示,再查看jsp页面的属性(右击jsp页面,选择properties,即可看到页面保存时的编码)b)include指令通过指明需要包含的文件路径被包含的jsp不会翻译成servlet,只能翻译最外层的jsp,这种包含方式叫静态包含只是将被包含jsp文件的内容包含进来,形成一个结构混乱的servletc)taglib指令 *5 JSP出错后处理方法 局部异常处理方式: a)errorPage=error.jsp表示当前jsp页面运行出错后,转发的页面地址 b)isErrorPage=true表示当前jsp页面是否为一个专用的出错页面,如果为true,web服务器自动产生exception内置对象 如果是false或不写该指令,web服务器不会自动产生exception内置对象 全局异常处理方式: c)在web.xml文件中,通过以下代码配置 java.lang.ArithmeticException /error.jsp 或 500 /error.jsp 谁优先:局部优先 6 M(Javabean)V(Jsp)C(Servlet)模式 1)M采用JavaBean技术为主 2)C采用Servlet技术为主 3)V采用JSP技术为主 4)JSP比较适合以视图显示为主,而Servlet比较适合以控制器为主*7 jsp九大隐式/内置对象 1)request:请求对象和域对象,如果使用request域对象,只能使用转发 2)response:响应对象 3)session:表示当前用户的会话,例如购物车适合用session 4)application:表示当前web应用的会话,例如WEB公共聊天室适合用applicationOut隐式对象同时使用out和response.getwriter()输出数据Tip: pageContext对象pageContext对象是JSP技术中最重要的一个对象,它代表当前JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如包含和跳转其它资源、检索其它域对象中的属性等。 findAttribute从,先后查找各个域中的属性,从小开始,即从pagecontext开始四个域对象的生命周期1、pageContext 在jsp执行时创建pageContext,jsp页面结束时pageContext销毁2、request 客户请求服务器时创建,请求结束request销毁3、session 客户机请求服务器时,第一次getSession时,服务器创建session,session过xx多长时间没用了(或调用了session.invalidate方法),服务器销毁session4、application(servletContext) web应用启动时就创建,web应用停止就销毁什么情况下用什么域的问题1、什么情况下用request域?如果在开发程序时,数据看完就没用了,那就应该把数据存在request域范围内。比如看新闻,新闻属于用户看完就没用的数据,这时servlet获得新闻数据,就应该存在request里面交给j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论