Servlet

Servlet

  • 是用Java编写的服务器端程序
  • 主要功能在于交互式地浏览和修改数据,生成动态Web内容

生命周期

Servlet生命周期

1.客户端请求服务器对应的Servlet,Web容器加载Servlet
2.web容器调用init方法,并创建response和request对象
3.传递给Service方法,并重写该方法,实现doGet()和doPost()
4.下一次对该Servlet的请求,Web容器会直接创建对应的response和request对象传递给Service()对象
5.web容器销毁时候卸载Servlet,并调用destroy方法



Servlet接口实现类相关

官方提供了FacesServlet、GenericServlet、HttpServlet三个接口实现类。
通常继承HttpServlet类,该实现类复写了Service方法,该类为客户机不同的请求方式提供了对应的处理方法,例如:doGet()、doPost()等

HttpServlet官方简介:
    Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site. 
    A subclass of HttpServlet must override at least one method, usually one of these: 
    doGet, if the servlet supports HTTP GET requests 
    doPost, for HTTP POST requests 
    doPut, for HTTP PUT requests 
    doDelete, for HTTP DELETE requests 
    init and destroy, to manage resources that are held for the life of the servlet 
    getServletInfo, which the servlet uses to provide information about itself 


doGet()方法

这里写图片描述



回写HTTP数据可能会造成的乱码

在Servlet中可通过response.getWriter()获取输出字符流对象,考虑到客户机和服务器语言环境不同会造成乱码问题,使用getWriter()前需要调用response对象的setContentType()和setCharacterEncoding()方法改变回写响应的码表。


        //设置response使用的码表,控制response用何种码表向客户机写数据
        response.setCharacterEncoding("utf-8");
        //设置HTTP响应头,告诉客户机以何种码表解析回写数据
        response.setContentType("text/html;charset=utf-8");

        PrintWriter writer = response.getWriter();
        writer.print("你好");

使用setCharacterEncoding和setContentType方法需要注意:

  • setContentType()用于设置到响应(HTTP)发送到客户机的编码说明,客户机会按照此编码解析数据
  • setCharacterEncoding()用于服务器写数据设置编码格式,此方法会覆盖setContentType()的设置,为了保证客户机接受数据不会乱码,先设置setCharacterEncoding()在设置setContentType().

这里写图片描述



IllegalStateException异常

对客户机的响应写入已经结束,在结束后再向客户机写入数据,会产生该异常。
由Servlet写入数据至客户机流程:
这里写图片描述

  • 使用forward跳转、redirect重定向等都会让缓存区处于committed状态,需要注意使用这些方法前不要向缓存区写数据,否则异常
  • 可以使用reset()方法清空缓存区、响应头(从缓存区写回客户机需要时间,此时可以使用reset()清空写回数据,从而达到重置)。如果缓存区已处于committed状态,则异常
  • reset()方法常用于清空缓存区,保持下一次输出数据正常(jsp生成html会有一些空白行)
  • 实际过程中调用response.sendRedirect()或者request.getRequestDisPatcher(“/….”).forward()后直接return;保证后续不会再向处于committed状态的缓存区写入数据


Servlet相关

ServletConfig

  • 使用this.getServletConfig()获取到ServletConfig对象。
  • 使用该对象可以获取到web.xml内配置的Servlet初始化参数。也可以获取到该Servlet名称等
  • 每个Servlet可以单独配置一组ServletConfig

ServletContext

  • 使用this.getServletContext()获取到ServletContext对象
  • 使用该对象可以获取web.xml内配置的context-param标签配置的数据
  • 在一个web应用中所有Servlet共用一个ServletContext
  • -



Response & Request常用方法

Request


                request.getRequestDispatcher("/..").forward(request, response); //请求转发  
                request.getRequestDispatcher("/...").include(request, response); //嵌套合成页面

//父类的方法
                request.getRequestURL(); //获取完整的资源名
                request.getQueryString(); //请求行参数部分
                request.getRemoteAddr(); //客户机IP
                request.getRemoteHost(); //客户机主机名
                request.getRemotePort(); //客户机端口
                request.getMethod(); //客户机请求方式
                request.getParameter("???"); //获取请求参数(单值)
                request.getParameterMap(); //配和BeanUtil完成数据采集
                request.getParameterValues("???"); //获取请求参数(多值)
                request.setAttribute("DATA", "data");  //使用request域传递数据
                request.getLocalAddr(); //服务器IP地址
                request.getLocalName(); //服务器主机名


Response

                response.setHeader(name, value); //设置头
                response.setDateHeader(name, date); //设置时间头
                response.sendRedirect("/...");   //网页重定向

                //父类的方法
                response.setContentType(type);  //设置传输数据格式
                response.setCharacterEncoding(charset); //设置响应编码格式
                response.getOutputStream(); //获取响应输出流
                response.getWriter(); //获取响应输出字符流



  • 理论上,客户机与服务器的应在同一会话中,但因为HTTP本身是无状态协议,又需要追踪客户机的操作记录,故引出了cookie技术。
  • 服务器在客户机第一次请求响应时向客户机写回cookie(标记数据值)且cookie保存在客户机本地,下一次客户机再访问服务器会携带cookie
  • 使用request.getCookies()获取到所有的cookies属性
  • 自定义cookie对象,为其配置好属性值、设置使用年限setMaxAge()、设置保存路径setPath()等
  • 对于一个配置好的cookie对象,使用response.addCookie()回写给客户机

cookie简述图



session

  • session机制将用户数据保存在服务器端
  • 一个客户机对象独占一个session对象,使用request.getSession()得到session对象
  • 改写session默认的回写cookie属性,使用session.getId()方法获取到每个session独有的sessionid,new cookie(“JSESSIONID”,id)一个新的cookie对象,然后setMaxAge等属性,最后addCookie回写即可


session简述图

这里写图片描述



用户禁用cookie如何使用session技术

  • 如果用户禁用了cookie,用户访问主页后内部跳转,使用response.encodeURL(“Servlet地址”)重写所有的超链接,在访问资源地址后加入session的id,保持id的传递。
  • 如果用户禁用cookie,用户访问需要重定向,则使用response.encodeRedirectURL(“重定向的地址”)重写新的地址,保持新地址后加入session的id

Servlet中三个域的使用范围

Request:短时间内使用,跳转页面后显示,就不用了

Session:后续操作需要获取先前数据做检验等

ServletContext:多个Servlet之间数据相互用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值