新闻中心

06-17
2017
有关Servlet和JSP的梳理0101
大二第一学期的时候有学JSP的课,但是因为在开学之前做过JSP的小项目,所以一个学期的课也没听,直到期末考试成绩出来了,才回想JSP的内容还有多少记得,没想到模模糊糊也记不起多少,赶紧回头学回来。接下来是关于Servlet和JSP的梳理。-------------------------------------------------------------------------------------------------------------------------------------------------  Servlet是一个Java程序,一个Servlet应用有一个或多个Servlet程序,而且JSP页面也会被转换和编译成Servlet程序。  Servlet应用无法独立运行,必须运行在Servlet容器中。Servlet容器将用户的请求传递给Servlet应用,并将结果返回给用户。由于大部分Servlet应用都包含多个JSP页面,因此更准确地说是“Servlet/JSP应用”。  其中,Servlet API是开发Servlet的主要技术。而Servlet API有以下4个Java包:Java包包含的内容javax.servlet定义Servlet和Servlet容器之间契约的类和接口javax.servlet.http定义HTTP Servlet和Servlet容器之间契约的类和接口javax.servlet.annotation标注Servlet、Filter、Listener的标注。它还被标注原件定义元数据javax.servlet.descriptor包含提供程序化登陆web应用程序的配置信息的类型。  Servlet技术的核心是Servlet,它是所有Servlet类必须直接或间接实现的一个接口,而Servlet接口定义了Servlet与Servlet容器之间的契约。这个契约归结起来就是,Servlet容器将Servlet类载入内存,并在Servlet实例上调用具体的方法。当用户的请求使得Servlet容器调用Servlet的Service方法,会传入一个ServletRequest实例和一个ServletResponse实例,其中,ServletRequest中封装了当前的HTTP请求,而ServletResponse表示当前用户的HTTP响应。对于每一个应用程序,Servlet容器还会创建一个ServletContext实例,这个对象中封装了上下文(应用程序)的环境详情。每个上下文只有一个ServletContext,而且每个Servlet实例都有一个配置的ServletConfig。  Servlet的生命周期方法:  Servlet容器的生命周期方法作用init该方法在Servlet第一次被请求的时候,Servlet就会调用这个方法,而后不再被调用,所以可以用这个方法进行初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig。Service每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求Servlet时,Servlet容器调用init方法和Service方法。后续的请求将只调用Service方法。destroy当要销毁Servlet时,Servlet容器就会调用这个方法。一般会在这个方法中编写清除代码。  在介绍一个Servlet中另外两个非生命周期的方法:Servlet容器的非生命周期方法作用getServletInfo这个方法会返回Servlet的描述getServletConfig这个方法会返回由Servlet容器传给init方法的ServletConfig。但是为了让getServletConfig返回一个非null值,必须将传给init方法的ServletConfig赋给一个类级变量。-------------------------------------------------------------------------------------------------------------------------------------------------   接下来是Servlet的各类接口:  ServletRequest 接口说明ServletRequest对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给Servlet的Service方法。ServletRequest封装了关于这个请求的信息。  常用的方法有:    方法说明public int getContentLength()返回请求主体的字节数。public java.lang.String getContentType()返回请求主体的MIME类型。public java.lang.String getParameter(java.lang.String name)返回指定请求参数的值public java.lang.String getProtocol()返回这个HTTP请求的协议名称和版本  ServletResponse接口说明ServletResponse该接口表示一个Servlet响应。在调用Servlet的Service方法前,Servlet容器首先创建一个ServletResponse,并将它作为第二个参数传给Service方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。  常用的方法: 方法说明getWriter()返回了一个可以向客户端发送文本的java.io.PrintWriter。默认情况下,PrintWriter对象使用ISO-8859-1编码。setContentType(“type”)设置响应的内容类型,并将”text/html”作为一个参数传入。如果没有设置相应内容类型,有些浏览器就会将HTML标签显示为普通文本。  ServletConfig  接口说明ServletConfig用于存储关于Servlet的配置信息。当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init()方法传入一个ServletConfig。ServletConfig封装可以通过@WebServlet或描述符传给Servlet的配置信息。   常用的方法: 方法说明java.lang.String getInitParameter(java,lang.String name)为了从Servlet内部获取到初始参数的值,要在Servlet容器传给Servlet的init方法的ServletConfig中调用getInitParameter方法。java.util.Enumration<java.lang.String> getInitParameterNames()返回所有初始参数名称的一个Enumeration。String contactName = servletConfig.getInitParameter(“contactName”)获取contactName参数值  ServletContext接口说明ServletContext每个Web应用程序只有一个上下文,所以ServletContext可以存储这个上下文,并且ServletContext还可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象,而且是用ServletContext内部的Map保存。  常用的方法: 方法说明getServletContext().getInitParameter(String name)获取在项目下的web.xml中设置context的初始化参数this.getServletContext().log(“测试”)在web.xml文件中,使用logger元素来设置日志文件getAttribute(String name)/get AttributeNames()获取ServletContext中的属性setAttribute(String name, Object object)设置ServletContext中的属性removeAttribute(String name)移除ServletContext中的属性  GenericServlet接口说明GenericServletGenericServlet实现了Servlet和ServletConfig接口。将init方法中的ServletConfig赋给一个类级变量,以便可以通过getServletConfig获取,为Servlet接口中的所有方法提供默认的实现,而且提供包括ServletConfig中的方法。  Http Servlets    接口说明HttpServletHttpServlet类覆盖了javax.servlet.GenericServlet类。使用HttpServlet时,还要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。而HttpServlet与GenericServlet的差别在于,HttpServlet覆盖的是doGet或者doPost方法,而不是Service方法,而且使用的是HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。HttpServletRequest表示HTTP环境中的Servlet请求HttpServletResponse表示HTTP环境中的Servlet响应  各个接口常用的方法如下:  接口方法说明 HttpServletRequestjava.lang.String getContextPath()返回表示请求上下文的请求URI部分。 HttpServletRequestCookie[] getCookies()返回一个Cookie对象的数组。 HttpServletRequestjava.lang.String getHeader(java.lang.String name)返回指定HTTP标题的值。 HttpServletRequestjava.lang.String getMethod()返回生成这个请求的HTTP方法名称 HttpServletRequestjava.lang.String getQueryString()返回请求URL中的查询字符串。 HttpServletRequestHttpSession getSession()返回与这个请求相关的会话对象。如果没有,将创建一个新的会话对象。 HttpServletRequestHttpSession getSession(Boolean create)返回与这个请求相关的绘画对象,如果有,并且create参数为True,将创建一个新的会话对象。 HttpServletResponsevoid addCookie(Cookie cookie)给这个响应对象添加一个cookie。 HttpServletResponsevoid addHeader(java.lang.String name, java.lang.String value)给这个响应对象添加一个header。 HttpServletResponsevoid sendRedirect(java.lang.String location)发送一条响应码,将浏览器跳转到指定的位置。-------------------------------------------------------------------------------------------------------------------------------------------------  当用户提交HTML表单时,在表单元素中输入的值就会被当作请求参数发送到服务器。HTML输入域(文本域、隐藏域或者密码域)或者文本区的值,会被当作字符串发送到服务器。空的输入域或者文本区会发送空的字符串。  包含多个值的select元素发出一个字符串数组,可以通过ServletRequest.getParameterValues进行处理。  核查过的复选框会发送字符串"on"到服务器,未经核查的复选框则不向服务器发送任何内容,ServletRequest.getParameter(fieldName)返回null。  单选框将被选中按钮的值发送到服务器。如果没有选择任何按钮,将没有任何内容被发送到服务器,并且ServletRequest.getParameter(fieldName)返会null。  如果一个表单中包含多个输入同名的元素,那么所有值都会被提交,并且必须利用ServletRequest.getParameterValues来获取它们。ServletRequest.getParameter将只返回最后一个值。