Servlet——servlet核心

文章目录

  • 1. GenericServlet
  • 2 HttpServlet
  • 3 HttpServletRequest
    • 3.1 httpServletRequest生命周期
    • 3.2 请求参数
    • 3.3 接口中的方法
    • 3.4 中文乱码问题
      • 3.4.1 解决中文乱码问题
  • 4.HttpServletResponse
    • 4.1 Response中方法
    • 4.2 解决Response中文乱码
  • 5 转发和重定向

1. GenericServlet

    genericServlet采用的缺省适配器设计模式。对Servlet接口中的大部分方法进行了空实现,service方法为抽象方法,留给子类实现
    init部分采用了模板方法设计模式,init()给子类实现
    实现ServletConfig接口方法,简化子类中关于servletConfig的相关代码

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private transient ServletConfig config;
	// 无参构造器,子类调用构造器时需要调用父类无参构造器
    public GenericServlet() {
    }
    //空实现大部分方法,省略部分。。
    public void destroy() {
    }
    public ServletConfig getServletConfig() {
        return this.config;
    }
	// 为了子类可以较简便的使用Servlet中的方法
    public ServletContext getServletContext() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getServletContext();
        }
    }
	// 模板方法设计模式
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
    //子类覆写
    public void init() throws ServletException {
    }
	  //留给子类实现
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}

2 HttpServlet

    继承于GenericServlet,重写service方法,分别get、post等各种网络请求。子类可以重写doGet、doPost方法实现相关需求。

public abstract class HttpServlet extends GenericServlet{
	
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException("non-HTTP request or response");
        }
        this.service(request, response);
    }
	//处理各种网络请求 
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        }
        ···········
    }
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }
    }
	··········省略··········
}

3 HttpServletRequest

3.1 httpServletRequest生命周期

  • 当客户端浏览器将请求(字符序列)发送到服务器后,服务器会根据HTTP请求协议的格式对请求进行解析。同时,服务器会创建HttpServletRequest的实现类RequestFacade的对象,即请求对象。然后再调用相应的set方法,将解析出来的数据封装到请求对象中。此时HttpServletRequest实例就创建并初始化完毕。也就是说,请求对象是由服务器创建。
  • 当服务器向客户端发送响应结束后,HttpServletRequest实例对象被服务器销毁。
  • 一次请求对应一个请求对象,另外一次请求对应另外一个请求对象,与之前的请求对象没有任何关系。HttpServletRequest实例的生命周期很短暂。

3.2 请求参数

    HttpServletRequest对于请求中所携带的参数是以Map的形式接收的,并且该Map的key为String,value为String数组。

3.3 接口中的方法

1.请求方式
getMethod()方法获取用户请求的方式
2.获取请求参数值

getParameter(String name) //根据提供的字符串序列参数获取用户请求中的对应参数值。
getParameterMap()//返回用户请求中的请求参数和请求参数值组成的键值对序列。(返回的是Map对象)
getParameterNames()//返回用户请求中的请求参数序列。
getParameterValues(String name)//方法返回指定请求参数对应的参数值序列(用于复选框)

3.获取域属性

void removeAttribute(String name) 
void setAttribute(String name,Object o)
obejct getAttribute(String name)

4.服务端相关方法

StringBuffer getRequestURL();//获取客户端访问服务器时请求的url路径
String getContextPath();//获取当前Web应用的根路径:(即:/ +项目名)
String String getRemoteAddr();//获取客户端IP
String getServletPath();//返回的是路径的精确部分(如果没有非精确部分(通配符部分),则是中的全部内容)
String getPathInfo();//非精确部分,即地址栏上与匹配之外的额外的部分(如果不存在,则为null

3.4 中文乱码问题

  • http的底层传输协议是tcp,数据均以字节流形式上传服务器,在请求中,字节为以%开头16进制字符。例如:name=%5B%9D%DF
  • 乱码如何产生的 :当用户通过浏览器提交一个UTF-8编码格式的中文汉字请求时,Tomcat服务器按照默认的ISO-8859-1格式解码时,就会产生乱码。即编解码的格式不同时会产生乱码。

3.4.1 解决中文乱码问题

1、解决get请求
    在Tomcat安装根目录的conf目录下的server.xml文件的标签中添加URIEncoding=“UTF-8”
2、get和post请求都可以解决
    将请求参数值字符串使用getBytes(String charsetName)方法

String name = request.getParameter("name");
byte[] bytes = name.getBytes("ISO8859-1");
name = new String(bytes, "UTF-8");

4.HttpServletResponse

    Web服务器收到一个Http请求后,会针对每个请求创建一个HttpServletRequest对象和HttpServletResponse对象。若需要获取客户端提交请求的相关信息,则需要从HttpServletRequest对象中获取;若需要向客户端发送数据,则需要通过HttpSerlvetResponse对象来完成。

4.1 Response中方法

PrintWriter getWriter() //返回一个标准输出流对象,用于向客户端中输出字符数据

4.2 解决Response中文乱码

  • void setContentType(string type) 设置响应的MIME类型:(可以设置为文本中的HTML,即“text/html;charset=UTF-8”)
  • void setCharaterEncoding(String charset)设置响应的字符编码(MIME字符集),即“text/html;charset=UTF-8”中的“charset=”后的字符串的设置

5 转发和重定向

  • 请求转发和重定向均是指的是请求的跳转方式。但请求转发是指服务器内跳转,重定向是指服务器外部跳转。(可以使用重定向由一个项目跳转到另外一个项目。)
  • 转发是一次请求,重定向是两次请求。请求转发只会发出一次请求,收到一次响应,所转发到的资源可以直接获取到请求中所携带的数据,浏览器中的地址栏显示的为用户所提交的请求路径,不会发生改变【只能跳转到当前应用的资源中】。
  • 重定向无法获取到用户请求提交的数据,也无法获取HttpServletRequest接口的实现类对象中设置的域属性的值。【同时重定向发送的请求方式为get请求,会导致浏览器中地址栏发生变化】(重定向可以防止表单重复提交)

请求转发和重定向的选择问题:

  • 若需要跳转到其他应用,则使用重定向。
  • 若是处理表单数据的Servlet,需要跳转到其他Servlet,则需要选择重定向。以此防止表单重复提交。
  • 若对某一请求进行处理的Servlet的执行需要消耗大量的服务器资源(CPU、内存),此时这个Servlet执行完毕后,需要重定向。
  • 其他情况下,一般使用请求转发
//获取RequestDispather接口的实现类对象,forward为RequestDispatcher接口中方法
RequestDispatcher getRequestDispatcher(String path)
void forward(ServletRequest request, ServletResponse response)//转发一个请求从一个servlet到服务器中的另外一个资源(包括servlet,JSP文件或者HTML文件)
 void sendRedirect(java.lang.String location)//请求的重定向:使用指定url路径为客户端发送一个临时的重定向响应(以此清空缓存)

你可能感兴趣的:(servlet,java,web)