servlet的作用:接收请求数据,处理请求,完成响应。
servlet的大多数方法不由我们调用,而是tomcat调用。servlet对象也是由tomcat创建。
servlet接口
public class ServletTest implements Servlet{
/**
* 生命周期方法:
* servlet对象销毁之前被tomcat调用,并只调用一次。
*
*
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
/**
* 获取servlet配置信息
*/
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig...");
return null;
}
/**
* 获取servlet信息
*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo...");
return null;
}
/**
* 生命周期方法:
* servlet对象创建之后马上被tomcat调用,并只执行一次。
*
*
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
/**
* 生命周期方法:
* 它会被调用多次!!
* 每次处理请求,都是在调用这个方法。
*
*
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("service...");
}
}
配置路径

通过运行得知:init方法在servlet被第一次访问时执行,且只执行了一次。可以得出,servlet在第一次被访问时创建,并且只创建一次,servlet是单例的。destroy方法在服务器停止时执行。servlet是单例的,说明也是线程不安全的。
总结特性:
1、单例
2、线程不安全,效率高。
servlet类由我们写,但由服务器创建,并由服务器来调用相应的方法。
servlet相关的类
1、ServletConfig

一个ServletConfig对象,对应着相应的web.xml中的servlet配置信息。
2、ServletRequest
封装了请求信息。请求头,请求体。
3、ServletResponse
响应对象
4、ServletContext
servlet上下文,服务器bai开始,其就存在,服务器关闭,其才释放,ServletContext所有用户用一个。
所以一些全局的参数可以配置在servletContext中
这里需要注意一点,如果你的应用是分布式部署的,那么每台服务器实例上部署的应用实例都各自拥有一个ServletContext实例。
<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->
<context-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</context-param>
ServletContext是javaWeb四大域对象之一:
1、PageContext
2、ServletRequest
3、HttpSession
4、ServletContext
可以用setAttribute和getAttribute,设置值和获取值。
servlet在tomcat启动是创建
<servlet>
<servlet-name>Bservlet</servlet-name>
<servlet-class>com.fuiou.servlet.Bservlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
req.getRemoteAddr()//获取ip地址
req.getMethod()//获取请求方式,post/get
需求:一个请求需要多个servlet才能完成。

req.getRequestDispatcher("/Bservlet").forward(req, resp);
请求转发:Aservlet可以设置响应头,Bservlet设置响应头和响应体。
req.getRequestDispatcher("").include(req, resp);
请求包含:由两个servlet共同完成
resp.sendRedirect("");
重定向:是两次请求
请求转发和重定向的区别
1、请求转发是一次请求一次响应,而重定向是两次请求两次响应
2、请求转发地址栏不变化,而重定向会显示后一个请求地址
3、请求转发只能转发道本项目其他servlet,而重定向还可以定向道其他项目
4、请求转法师是服务器行为,只需给出转发servlet路径,而重定向要给出requestURI,即包含项目名。
5、两者相比,请求转发效率较高,但是如果需要地址栏发生变化,就只能用重定向,如果需要在下一个servlet中获取request的数据,那么只能用请求转发。
servlet三大域对象
request:生命周期,一次请求。
session:生命周期,浏览器关闭。
application:生命周期,程序销毁。
编码问题。
1、响应编码
使用resp.getWriter();向客户端发送字符数据,如果之前没设置编码,那么一定会乱码。默认用的是iso-8859-1,浏览器会当成GBK
2、服务器可以使用resp.setCharacterEncoding("UTF-8");但是浏览器还是用GBK,所以还是乱码。
3、resp.setHeader("Content-Type", "text/html;charset=utf-8");通过设置响应头,来告诉浏览器使用什么编码。这个方法还是设置了setCharacterEncoding的编码,所以不用调用setCharacterEncoding了。

2、请求编码
1、在地址栏中直接给出参数(GBK)
2、在页面中点击表单或者链接(UTF-8)如果你的页面是utf-8的,那么传递的参数就是utf-8
3、tomcat默认使用iso来处理请求参数
get请求,
1)修改tomcat的config/server,xml的URIEncoding=''UTF-8"
2)使用iso编码,然后utf-8解码回来。
注意:tomcat8默认使用的utf-8,所以就不用改了
post请求
req.setCharacterEncoding("UTF-8");
String name=req.getParameter("name");
System.out.println(name);
URL编码:把中文转成%后面跟随两位16进制
网友评论