Servlet

生命周期方法:

  1. void init(ServletConfig):出生之后(1次);
  2. void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用;
  3. void destroy():临死之前(1次);

 

特性:

  1. 单例,一个类只有一个对象;当然可能存在多个Servlet类!
  2. 线程不案例的,所以它的效率是高的!

 

Servlet类由我们来写,但对象由服务器来创建,并且由服务器来调用相应的方法。

 

 

基本的web.xml的格式

web.xml(下面内容需要背下来)

    <servlet>

       <servlet-name>hello</servlet-name>

       <servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>hello</servlet-name>

       <url-pattern>/helloworld</url-pattern>

    </servlet-mapping> 

 

 

HttpServletRequest方法:

  1. String getParameter(String paramName):获取指定请求参数的值;
  2. String getMethod():获取请求方法,例如GET或POST;
  3. String getHeader(String name):获取指定请求头的值;
  4. void setCharacterEncoding(String encoding):设置请求体的编码!因为GET请求没有请求体,所以这个方法只只对POST请求有效。当调用request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用!

 

HttpServletResponse方法:

  1. PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);
  2. ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片;
  3. void setCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调用setCharacterEncoding(“utf-8”);之后,再response.getWriter()获取字符响应流对象,这时的响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端;
  4. void setHeader(String name, String value):向客户端添加响应头信息,例如setHeader(“Refresh”, “3;url=http://www.itcast.cn”),表示3秒后自动刷新到http://www.itcast.cn;
  5. void setContentType(String contentType):该方法是setHeader(“content-type”, “xxx”)的简便方法,即用来添加名为content-type响应头的方法。content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;
  6. void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:response(404, “您要查找的资源不存在!”)。

 

 

ServletConfig

ServletConfig对象对应web.xml文件中的<servlet>元素。例如你想获取当前Servlet在web.xml文件中的配置名,那么可以使用servletConfig.getServletName()方法获取!

 

ServletConfig对象是由服务器创建的,然后传递给Servlet的init()方法,你可以在init()方法中使用它!

  1. String getServletName():获取Servlet在web.xml文件中的配置名称,即<servlet-name>指定的名称;
  2. ServletContext getServletContext():用来获取ServletContext对象,ServletContext会在后面讲解;
  3. String getInitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名来获取参数值;
  4. Enumeration getInitParameterNames():用来获取在web.xml中配置的所有初始化参数名称;

在<servlet>元素中还可以配置初始化参数:

  <servlet>

    <servlet-name>One</servlet-name>

    <servlet-class>cn.itcast.servlet.OneServlet</servlet-class>

    <init-param>

        <param-name>paramName1</param-name>

        <param-value>paramValue1</param-value>

    </init-param>

    <init-param>

        <param-name>paramName2</param-name>

        <param-value>paramValue2</param-value>

    </init-param>

[崔1]   </servlet>

 

在OneServlet中,可以使用ServletConfig对象的getInitParameter()方法来获取初始化参数,例如:

String value1 = servletConfig.getInitParameter(“paramName1”);//获取到paramValue1

 

 

ServletContext(重要)

一个项目只有一个ServletContext对象!

我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!

与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!

public class MyServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) {

    ServletContext context = this.getServletContext();

}

}

3 域对象的功能

ServletContext是JavaWeb四大域对象之一:

  1. PageContext;
  2. ServletRequest;
  3. HttpSession;
  4. ServletContext;

所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:

  1. void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
  2. Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
  3. void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
  4. Enumeration getAttributeNames():获取所有域属性的名称;

 

 

response响应正文

  1. PrintWriter out = response.getWriter():获取字符流;
  2. ServletOutputStream out = response.getOutputStream():获取字节流;
  3. resp.setHeader("Refresh","3,url=https://www.baidu.com");  刷新跳转
  4. response.setStatus(302); response.setHeader("Location", "http://www.itcast.cn") ;重定向,若没有状态码,不会跳转

    response.sendRedirect("http://www.itcast.cn"); 使用它时可以省略状态码

重定向小结

重定向是两次请求;

重定向的URL可以是其他应用,不局限于当前应用;

重定向的响应头为302,并且必须要有Location响应头;

重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;

 

request响应正文

request的功能可以分为以下几种:

  1. 封装了请求头数据;
  2. 封装了请求正文数据,如果是GET请求,那么就没有正文;
  3. request是一个域对象,可以把它当成Map来添加获取数据;
  4. request提供了请求转发和请求包含功能。

 

 

request获取请求相关的其它方法

request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。

  1. int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
  2. String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
  3. String getMethod():返回请求方法,例如:GET
  4. Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
  5. String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
  6. void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
  7. String getContextPath():返回上下文路径,例如:/hello
  8. String getQueryString():返回请求URL中的参数,例如:name=zhangSan
  9. String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
  10. StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
  11. String getServletPath():返回Servlet路径,例如:/oneServlet
  12. String getRemoteAddr():返回当前客户端的IP地址;
  13. String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
  14. String getScheme():返回请求协议,例如:http;
  15. String getServerName():返回主机名,例如:localhost
  16. int getServerPort():返回服务器端口号,例如:8080

 

请求转发和请求包含

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

RequestDispatcher rd = request.getRequestDispatcher("/BServlet");[崔1] 

       rd.forward(request, response)[崔2] ;

 

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

       rd.include[崔1] (request, response);

 

  1. 请求转发是一个请求,而重定向是两个请求;
  2. 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
  3. 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
  4. 请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
  5. 重定向的第二个请求一定是GET;

 

Cookie

Cookie的覆盖

  如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

 

Cookie的生命

2.1 什么是Cookie的生命

  Cookie不只是有name和value,Cookie还是生命。所谓生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。

  1. cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
  2. cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;
  3. cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。

 

HttpSession

获取HttpSession对象

  1. HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回;
  2. HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null;

HttpSession是域对象

我们已经学习过HttpServletRequest、ServletContext,它们都是域对象,现在我们又学习了一个HttpSession,它也是域对象。它们三个是Servlet中可以使用的域对象,而JSP中可以多使用一个域对象,明天我们再讲解JSP的第四个域对象。

  1. HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据;
  2. ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享;
  3. HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;

 

session其他常用API

  1. String getId():获取sessionId;
  2. int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session;
  3. void setMaxInactiveInterval(int interval):设置session允许的最大不活动时间(秒),如果设置为1秒,那么只要session在1秒内不被使用,那么session就会被移除;
  4. long getCreationTime():返回session的创建时间,返回值为当前时间的毫秒值;
  5. long getLastAccessedTime():返回session的最后活动时间,返回值为当前时间的毫秒值;
  6. void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId;
  7. boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值