Java EE学习笔记

一:Servlet部分

1.      Web程序的开发就是写servlet,所有的都是Servletjsp也是一种特殊的Servlet

2.      所有的servlet必须实现servlet接口,但通常是去实现HttpServlet,

层次结构是servletßGenericServletßHttpServlet,HttpServlet中有service()方法,和各种doGet(),doPost()doXXX()方法来接受请求并返回响应,service()方法和各种doXXX()的参数都是HttpRequestHttpResponse.

3.      Servlet容器或服务器接受请求后会将请求封装成HttpServletRequest对象,并将这个HttpServletRequest对象和一个HttpServletReponse对象传给所请求的servletservice(),这个Service()在根据请求方式去调用响应的doXXX()方法。所有的请求信息都封装在了HttpServletRequest对象中,有响应的方法都能拿到。所有的响应信息都被封装在HttpServletResponse对象中。

4.      根据Servlet规范,java Web应用程序有特定的目录结构

5.      写完Servlet类后,还不能用,必须在web.xml中配置servlet,配两个东西,一个,一个,其中<url-pattern>可以使用*,?等通配符,如下:

<servlet>

    <description>description>

    <display-name>MyServlet2display-name>

    <servlet-name>MyServlet2servlet-name>

    <servlet-class>com.zhengjie.servlets.MyServlet2servlet-class>

servlet>

<servlet-mapping>

    <servlet-name>MyServlet2servlet-name>

<url-pattern>/MyServlet2url-pattern>

servlet-mapping>

访问URL就是:http://localhost:8080/ProjectName/MyServlet2

6.      Servlet配置中还可以配置一些初始化参数,在servlet中用getInitParameter(String param)来获取初始化参数:

<servlet>

    <description>description>

    <display-name>MyServlet2display-name>

    <servlet-name>MyServlet2servlet-name>

<servlet-class>com.zhengjie.servlets.MyServlet2servlet-class>

      name

      zhangsan

servlet>

7.      上面讲到的初始化参数只能某个servlet获取,还有一种是上下文参数,所有servlet都能获取,配置如下:

<context-param>

       <param-name>contextConfigLocationparam-name>

       <param-value>

           classpath*:spring/applicationContext*.xml

       param-value>

context-param>

这种初始化参数每个servlet都能获取到,servletgetServletConfig()获取ServletConfig对象,在调servletConfig对象的getServletContext()获取servletContext对象,然后再调servletContext对象的getInitParameter(String param)获取上下文初始化参数。

8.      初始化参数和上下文参数只能配置简单的字符串类型参数,配置其他类型的参数应该配在XML文件或properties文件中,在程序中读取。

9.      Servlet的生命周期

(1)      servlet的生命周期是有容器或服务器维护的

(2)      servlet在服务器启动或客户端第一次请求该servlet是初始化一个对象(servlet的配置决定load-on-startup01),会调用servletinit()方法,并用该对象处理所有的请求(以多线程的方式)。

(3)      servlet在容器或服务器停止时结束生命周期,会调用servletdestory()方法。

10.  servlet的跳转:

(1)      转向(forward,MVC框架常用的一种方式,对客户端是透明,客户端不知道服务器端的跳转

RequestDispatcher rd = request.getRequestDispatcher("/XXXservlet");

     rd.forward(request, response);

(2)      重定向(redirect,相当于客户端重新请求了新的地址

response.sendRedirect("/xxxServlet");

 

 

11.  servlet不是线程安全的,多个线程访问同一个servlet时会有问题,解决办法是:不在servlet类中定义属性,而是直接在doxxx()方法中定义属性。

二:jsp部分

1.      jsp也是servlet,是另一种更像htmlservlet。容器或服务器在编译时会将jsp编译成servlet

2.      servlet是先编译成class文件再部署到服务器上,JSP页面是先直接把把JSP页面部署到服务器上,在客服端第一次请求该JSP时,服务器才把它转换成servlet并编译成class文件,因此第一次访问JSP会比较慢。

3.      jspjava部分用<%%>括起来,<%= %>用于输出,类似于servlet中的out.print()方法,在<%!   %>之间定义方法。

4.      jsp指令,<%@  %>包起来。主要有3jsp指令:page,include,tablib

5.      <%@ include file=”URL”%>的区别

1<%@ include file=”URL”%>是先把被包含的文件包含进来,然后编译成一个Class文件,属于先包含后编译。

2是先单独执行被包含的JSP页面,再把执行结果包含进来,属于先编译后包含。

6. el表达式取值必需是servlet四大作用(servletContext>session>request>pageContext)中有的值, 这四个域都有setAttribute("",object)方法和getAttribute("")方法 el表达式 会自动从四大域中按作用范围从小到达寻找搜寻对应名字的值,其内部调用的就是pageContextfindAttribute("")方法;如果要想在页面通过el表达式得到值就必需先调用域的setAttribute方法把值设置进去,不需要什么配置,直接写el表达式就可以如下代码

                    <%

                                         application.setAttribute("name","zhangsan");//Context

                                         session.setAttribute("name","lisi");//session

                                         request.setAttribute("name","wangwu"); //request

                                         pageContext.setAttribute("name","zhaoliu");//page

                    %>

                    ${name}

输出结果是page域中的zhaoliu 如果将page域删掉则输出wangwu 依次类推

6.      EL表达式,取值的默认顺序是:servletContext>session>request>pageContext,这是在没有作用域前缀的情况下,EL表达式可指定作用域前缀如:${requestScope.person.age},所有作用域如下图:

 

 

 

7.      El表达式还支持简单计算如:${1+1},${1<2}

8.      Jsp页面中包含了很多隐藏的对象:out,request,response,config,session,application,page,pageContext,exception等,可以直接使用。

三:会话跟踪

1.      因为http协议时无状态的协议,一旦交互完毕就断开连接,所以无法记录会话,所以出现两种技术来记录会话,Cookiesession

2.      Cookie实际就是客户端浏览器保存的一段文字,用来表明身份,每次请求服务器是,服务器就可以根据cookie内容来判断客户端身份。

3.      JavaCookie封装成javax.servlet.http.Cookie类,cookie是以键值对的形式存在,没个cookie只有一个键值对。

4.      服务器可以通过request.getCookies()来获取客服端Cookie,可以通过response.addCookie(Cookie cookie)来向客户端写Cookie

5.      Java中有两个字符编码的类:

(1)      编码用java.net.URLEncoder类的encode(String str,String encoding)方法,如:

String name = URLEncoder.encode(“姓名,“UTF-8)

(2)      解码用java.net.URLDecoder类的decode(String str,String encoding)方法,如:

String name = URLDecoder.decode(“姓名,“UTF-8);

6.      cookie可以设置有效时间,cookie.setMaxAge(100000),单位为秒。

7.      cookie不支持删除和修改,只能写一个重名的cookie覆盖掉原来的cookie,想删除就把MaxAge设置成0

8.      cookie保存在客户端,所以JavaScript有优先权操作cookiedocument.cookie可以获取cookie

9.      除了cookie还有一种会话跟踪技术是session,session保存在服务器端,有一定的存储压力,cookie保存在客户端。

10.  Sessionjava封装成java.servlet.http.HttpSession类,每个客户端在服务器端都对应一个session Request.getSession()来获取sessionrequest.getSession(true)在没有Session时会创建SessionSession也是键值对的形式,session.setAttribute(Stringstr,Object obj)设置Sessionsession.getAttribute(String str)来获取Session值。

11.  JSP页面中,可以直接用隐藏对象Session来操作Session

12.  Session在客户端第一次访问服务器是自动创建,为了存储效率Seesion一般存在内存中,所有不能存储大的数据,防止内存溢出。

13.  随着访问客户增多,Session会越来越多,所以session有一个有效时间,到时间后服务器会自动将本Session删除。Session.setMaxInactiveInterval(long l)设置有效时间,单位秒。

14.  Session需要cookie的支持,虽然session的数据存在服务器端,客户端需要保存一个标示来表明客户身份,客户端只会传一个JSSEIONID来表明身份。

15.  在浏览器禁用Cookie后,sessioncookie都不能用了,还有另一种会话跟踪技术是URL重写,就是在服务器响应式将sessionId返回到客户端,详见JAVA+web整合开发王者归来书籍。

16.  SessionCookie区别:

(1)      cookie存在客户端,session存在服务器端

(2)      cookie只能存少量的文字信息,session可以存各种类型数据,包括java对象。

(3)      每个客户端都会有一个session,而且session是存在服务器端,所以用session时服务器负担较大。

四:过滤器Filter

1.      过滤器(filter)和监听器(listener)是servlet规范里的两个高级特性。

2.      过滤器的处理过程如图:

3.      filter提出了滤镜链(FilterChain)的概念,每个滤镜链包含多个过滤器(Filter)。

4.      所以的Filter必须实现javax.servlet.Filter接口,filter接口有3个方法,init(FilterConfig config),destroy(),doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain)

5.      doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain)方法中要只执行chain.doFilter(request,response),这样request才会流转到chain中的下一个Filter,最后流转到servlet

6.      过滤器(Filter),也是需要在web.xml中配置的:

<filter>

     <filter-name>myFilterfilter-name>

     <filter-class>com.filter.MyFilterfilter-class>

     <init-param>

         <param-name>nameparam-name>

         <param-value>zhengjieparam-value>

     init-param>

  filter>

 

  <filter-mapping>

     <filter-name>myFilterfilter-name>

     <url-pattern>/jsp/*url-pattern>

     <url-pattern>*.dourl-pattern>

     <dispatcher>REQUESTdispatcher>

     <dispatcher>FORWARDdispatcher>

  filter-mapping>

表示什么样的请求路径会被过滤,支持通配符,一个filter可以配多个表示什么样的请求会被过滤,选项有:REQUEST,FORWARD,INCLUDE,ERROR,一个filter可以配多个

7.      filter的执行顺序是按照web.xml配置的顺序执行的。

8.      常用用途:字符编码的过滤器

 

五:监听器(listener

1.      监听器主要实现对requestsessioncontext的监听。

2.      使用监听要实现响应的接口,使用不同的监听,就实现不同的监听接口,只管实现接口的方法就行了,响应时间发生时,服务器会自动掉相应的监听方法。

六:JSTL标签库

1.JSTLjava stand taglibrary,java标准标签库。

1.JSPEL表达式是一个很有用的工具。但EL表达式功能有限,加上JSTLEL配合使用就基本可实现所有功能了。

 

 

你可能感兴趣的:(Java EE学习笔记)