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页面中的路径:这两个路径都是由浏览器端解析,/代表服务器的根目录。