javaservlet d6

一.javaservlet的生命周期

  他的出生是在服务器首次调用的时候产生的,当调用构造器和init()时候就会出来,而且构造方法和initi()方法只会被调用一次,而对应的service方法就会被调用多次了,每次向服务器发送请求就会调用一次,destory方法只会被执行一次,当servlet被关闭的时候就会出来释放资源。具体操作代码

package com;


import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class haha
 */
@WebServlet("/haha")
public class haha implements Servlet {
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public haha() {
        super();
        // TODO Auto-generated constructor stub
    }


    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("销毁方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("init()方法");
        
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("service方法");
        
    }

}

当启动tomcat后访问该映射地址会出现两行

init()方法
service方法

也就是说在创建访问servlet的时候只执行了这两个代码,而并没执行销毁方法。

当不关闭tomcat时继续访问地址,会出现 service方法 这一行,就是说在系统创建完这个servlet的时候并没有在再执行init方法了,只执行了service方法,说明了init方法只执行一次,构造方法也执行了一次,多次被调用,说明他是一个单例的。而对浏览器怎么访问也不会调用destory方法,当关闭tmocat的时候会出现一行销毁方法,说明了方法这时被调用,它用来释放掉资源的,关闭程序。

二.乱码问题

 1.原因分析:

  Http协议进行通信的时候是基于请求和响应的,传输的内容我们称之为报文!
  Http协议会按照一定的规则将报文编码,然后在读取的时候再使用响应的解码格式进行解码!
  这个一定的规则指的就是字符集:ASCII,iso8859-1,gbk,gb2312,utf-8(这个是通用的)
  编码:将字符按照字符集转化为二进制格式
  解码:将二进制代码按照响应的字符集转化为字符!
  乱码的根本原因:就是编码和解码指定的字符集不一致造成的!
  解决方案:统一编码和解码的字符集,统一成utf-8字符集!

2.解决:

     1)请求报文(代表requset)

    浏览器编码向服务器解码

    首先来设计浏览器的编码格式就行,将它设计成utf-8即可,第二部在解码的时候将它转换成utf-8就行。但是get请求和post请求又有区别。

  因为Tomcat对get和post两种提交方式的处理方法不一样造成的。自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。而GET请求则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码所以需要区别对待

对于get请求:

解码:使用的是tomcat默认的解码格式,默认是iso8859-1;我们在server.xml文件中设置:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

对于post请求:

post请求:
解码:使用的是tomcat默认的解码格式,默认是iso8859-1;
在服务器端我们使用的是:req.setCharacterEncoding("utf-8");来设置解码格式
注意:req.setCharacterEncoding("utf-8")一定要设置在第一次获取请求参数之前!
 2)响应报文(代表response)

  

  服务器编码------------->浏览器解码

  第一种解决方案:
  resp.setCharacterEncoding("utf-8");
  resp.setHeader("Content-Type", "text/html;charset=utf-8");
  第二种解决方案:
  resp.setHeader("Content-Type", "text/html;charset=utf-8");
  第三种方案:
  resp.setContentType("text/html;charset=utf-8");

  其实这三种方式是一样的,都是将返回给浏览器的编码设置成utf-8,而在浏览器的解码会在开头写上一段<meta charset="UTF-8">就可以了。

三.路径

  相对路径:是以字符开头的,它对应的是找不到的地址,表示两个文件的相对关系,由与本文件的父子关系,来确定位置,或者说来调用。对于项目来说它会不断变化位置的所以在后面不建议使用相对地址。

  绝对路径:是以/开头表示的,他是单独能找到的地址,在计算机或者网址里能够找到的地址,而/在servlet对应的含义又不相同,有时候对应的是服务器根目录,有时候又对应的是项目的根目录,它的根本区别在于是服务器还是浏览器对其进行解析的,如果是浏览器解析的就代表了是服务器的根目录,如果是服务器解析的说明代表的是项目的根目录。

常见的路径:

     web里url-pattern和转发(request)的路径: 这两个路径都是由服务器端解析,/代表项目的根目录。

     重定向的路径和html页面中的路径:这两个路径都是由浏览器端解析,/代表服务器的根目录。

 

  

  

 

posted on 2017-11-15 20:32  国名老公yt  阅读(152)  评论(0编辑  收藏  举报