Servlet简析
1.Servlet的实现
1.1新建Servlet类 1.2实现Servlet规范(继承 HttpServlet 类) 1.3重写service方法 1.4设置注解 @WebServlet("/路径") 注:"/"一定要加上! 在完成好了一切代码的编写后,还需要向服务器说明,特定请求对应特定资源。 1.5发布项目并启动服务 1.6 访问并查看结果
import javax
.servlet
.ServletException
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
@WebServlet("/ser01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
System
.out
.println("Hello...");
resp
.setContentType("text/html");
resp
.getWriter().write("<h3>Hello</h3>");
}
}
2.Servlet的生命周期
实例和初始化时机 当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。就绪/调用/服务阶段 有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。销毁时机 当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。 Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载–>实例化–>服务–>销毁。
import javax
.servlet
.ServletException
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
@WebServlet("/ser02")
public class Servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
System
.out
.println("Servlet02 service...");
}
@Override
public void destroy() {
System
.out
.println("Servlet02 destroy...");
}
@Override
public void init() throws ServletException
{
System
.out
.println("Servlet02 init...");
}
}
import javax
.servlet
.ServletException
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
@WebServlet("/ser03")
public class Servlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
String method
= req
.getMethod();
System
.out
.println(method
);
doPost(req
,resp
);
}
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
System
.out
.println("POST...");
}
}
3.HttpServletRequest对象
常用方法 获取请求路径获取请求的参数(重要!!!) request.getParameter(“参数名”);请求乱码问题 乱码原因:request有默认的解析编码,ISO-8859-1,这种编码格式不支持中文,传递中文参数必定乱码。 解决方案: 1. 只针对POST请求的乱码问题 (处理所有参数) request.setCharacterEncoding(“UTF-8”); 2. 任意请求方式都有效 (一次处理一个参数) new String(request.getParameter(“参数名”).getBytes(“ISO-8859-1”), “UTF-8”); 目前Tomcat8及以上版本GET请求不会出现乱码,所以目前只需要处理POST请求的参数乱码即可。请求转发 一种跳转方式。
服务端跳转。地址栏不会发生改变只有一次请求数据可以共享 request作用域 只在一次请求中有效,只在请求转发跳转有效 request.setAttribute(“参数名”,“参数值”); 设置作用域(任意类型的数据) request.getAttribute(“参数名”); 获取指定作用域的值 request.removeAttribute(“参数名”); 移除指定作用域的值
import javax
.servlet
.ServletException
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
@WebServlet("/ser04")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response
) throws ServletException
, IOException
{
request
.setCharacterEncoding("UTF-8");
System
.out
.println(request
.getMethod());
System
.out
.println(request
.getRequestURL());
System
.out
.println(request
.getRequestURI());
System
.out
.println(request
.getQueryString());
System
.out
.println(request
.getProtocol());
System
.out
.println(request
.getContextPath());
String uname
= request
.getParameter("userName");
System
.out
.println("姓名:" + uname
);
String upwd
= request
.getParameter("userPwd");
System
.out
.println("密码:" + upwd
);
if (uname
.equals("admin") && upwd
.equals("admin")) {
request
.setAttribute("userName",uname
);
request
.getRequestDispatcher("index.jsp").forward(request
,response
);
} else {
request
.setAttribute("msg","姓名或密码不正确!");
request
.getRequestDispatcher("login.jsp").forward(request
,response
);
}
}
}
4.HttpServletResponse对象
响应数据
字符输出流 getWriter()
字节输出流 getOutputStream();
注:两种流不能同时使用!
响应乱码问题
重定向
package com
.shsxt
.servlet
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.ServletOutputStream
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
import java
.io
.PrintWriter
;
@WebServlet("/ser05")
public class Servlet05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
resp
.setContentType("text/html;charset=UTF-8");
PrintWriter writer
= resp
.getWriter();
writer
.write("你好");
}
}
5.Servlet的三大域对象
1. request域对象
在一次请求中有效。请求转发有效,重定向失效。
2. session域对象
在一次会话中有效。请求转发和重定向都有效,session销毁后失效。
3. servletContext域对象
在整个应用程序中有效。服务器关闭后失效。