前言
Servlet是服务器内部的小程序,简单来说就是一个java程序,运行在Web服务器上,用于接收和响应客户端请求。可用于监听器、过滤器
Servlet生命周期
/*
* 3.0版本直接注解方式配置servlet
* 2.5版本需要在web.xml中手动配置servlet
* */
@WebServlet("/servletDemo")
public class ServletDemo extends HttpServlet {
/*
* Servlet生命周期:
* 初始化init
* 处理请求和响应service
* 销毁destory:项目从tomcat移除或者关闭tomcat时执行
* 注意:doGet和doPost不是生命周期中方法
* */
/*初始化方法
* 一个servlet只能初始化一次init方法
* 默认情况下,第一次访问servlet时会创建servlet实例
* */
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet init");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*service方法
* 该方法为处理请求和响应
* 客户端每次请求都会执行该方法,doGet/doPost同
* */
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet service");
}
/*get方法*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet method:get");
//1.获取ServletConfig配置参数,很少使用
ServletConfig config = getServletConfig();
String name = config.getInitParameter("name");
System.out.println("获取ServletConfig配置参数name:"+name);
//2.获取Servlet上下文对象ServletContext
ServletContext context = getServletContext();
String sex = context.getInitParameter("sex");
System.out.println("获取Servlet上下文对象sex :"+sex );
//3.通过ServletContext获取绝对路径
//3.1.src下资源
context.getRealPath("WEB-INF/classes/1.txt");
//3.2.获取webContent下资源
context.getRealPath("index.html ");
//4.ServletContext域对象使用
context.setAttrubute("att","lisi");
String att = (String)context.getAttrubute("att");
}
/*post方法*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet method:post");
}
@Override
public String getServletInfo() {
return null;
}
/*销毁方法*/
@Override
public void destroy() {
System.out.println("servlet destory");
}
}
ServletContext上下文对象
定义:在web工程中只有一个上下文对象,在任何一个servlet下,都可以获取到这个上下文对象
作用:
①配置全局参数
②获取web资源绝对路径(根据工程相对路径获取他相对于tomcat服务器的绝对路径)
③获取域对象数据
Servlet在2.5版本web项目中的配置
<!-- servlet加载过程:
1.找到tomcat应用
2.找到项目
3.找到web.xml
4.通过url-pattern找到servlet-mapping
5.通过servlet-mapping找到servlet-name
6.通过servlet-name找到servlet-class
7.通过servlet-class找到servlet类进行加载
-->
<web-app>
...
<context-param>
<param-name>sex</param-name>
<param-value>man</param-value>
</context-param>
...
<!-- 配置servlet信息 -->
<servlet>
<!-- servlet名称 -->
<servlet-name>servletDemo</servlet-name>
<!-- servlet完整类名 -->
<servlet-class>com.test.servletDemo</servlet-class>
<!-- 使servlet随着服务器启动而创建实例,数字不得为负数,建议>2 -->
<!-- <load-on-startup>2</load-on-startup> -->
<!-- servlet配置参数,可以使用ServletConfig对象获取,很少使用 -->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</servlet-class>
</servlet>
<!-- 配置servlet映射信息 -->
<servlet-mapping>
<!-- servlet名称,必须与servlet标签中servlet-name值相同 -->
<servlet-name>servletDemo</servlet-name>
<!-- 访问servlet的路径设置 -->
<url-pattern>/sd</url-pattern>
</servlet-mapping>
...
</web-app>
解决请求/响应乱码
/*
* 解决请求乱码
* get请求中文不会发生乱码(tomcat8以上,编码默认utf-8)
* post请求参数中文需要进行编码转换
* 编码转换语句需要放在取参数前
* */
request.setCharacterEncoding("UTF-8");
/*
* 解决响应乱码
* */
response.setContentType("text/html;charset=UTF-8");
转发和重定向(跳转页面)
/*
* 转发/重定向区别:
* 转发是request中的方法, 重定向是response中的方法
* 转发在服务器端完成,重定向在客户端完成
* 转发后请求栏地址不变,重定向后地址栏发生变化
* 转发是同一次请求,重定向是多次请求
* 转发速度快,重定向速度慢
* 转发可以在请求中附带参数,重定向不能
* */
request.getRequestDispatcher("success.html).forward(request,response);
request.sendRedirect("success.html);