Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
第一步:创建包
第二步:创建类(com.xxx.MyServlet),并且需要实现Servlet接口中的所有方法
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("MyServlet init ...");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
System.out.println("MyServlet service ...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("MyServlet destroy ...");
}
}
方法介绍:
- init:Servlet初始化时调用的方法
- getServletConfig:获取当前Servlet的配置信息
- service:调用Servlet真正去处理逻辑的方法
- getServletInfo:它提供有关Servlet的信息,如作者、版本、版权
- destroy:Servlet销毁时调用的方法
第三步:配置映射(web.xml中新增以下代码)
MyServlet com.caochenlei.servlet.demo.MyServlet MyServlet /MyServlet
配置介绍: 在IDEA部署JavaWeb的二三事+Servlet配置
servlet标签用于配置Servlet的基本信息
- servlet-class:代表当前Servlet的具体类路径,注意最后不包含.java
- servlet-name:代表当前Servlet的别名,可以和原Servlet名称一样,也可以不一样,一般我们就一样就行了
servlet-mapping标签用于配置请求路径与具体处理Servlet的对应关系
- url-pattern:这里写你要匹配的地址路径 com.caochenlei.servlet.demo.MyServlet
- servlet-name:如果匹配到请求,该交给哪一个Servlet处理,这里的servlet-name其实就是一个Servlet的别名
第四步:启动tomcat,然后浏览器输入地址访问
(http://localhost:8080/MyServlet)
第五步:正常关闭Tomcat服务器
Servlet执行过程 Servlet生命周期Servlet运行在Servlet容器中,其生命周期由容器来管理。
Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。
Servlet的生命周期包含了下面4个阶段:
- 类加载和实例化
- 初始化:init()
- 请求处理:service()
- 销毁:destroy()
有一种Servlet的实现子类,把大部分方法都是实现了,而我们只要关注请求处理就行了,那答案肯定是有的,这个类就是HttpServlet,我们只要继承HttpServlet类重写GET、POST方法就能实现一个简单的Servlet请求处理。
Servlet的继承体系如下图:
用来获取Servlet的上下文,在服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象,当从服务器移除托管或者是关闭服务器时,ServletContext将会被销毁。它主要有以下几方面作用:
- 获取全局配置参数
- 获取web工程中的资源
- 在servlet间共享数据域对象
通过ServletConfig对象可以获取servlet在配置的时候一些信息。
HttpServletRequestHttpServletRequest这个对象封装了客户端提交过来的一切数据。
如何解决请求数据中文乱码问题?- GET方式
// 先用原来的编码解码再用UTF—8重新编码。
String newUsername = new String(username.getBytes("ISO-8859-1"), "UTF-8");
- POST方式
// 这行设置一定要写在getParameter之前。
request.setCharacterEncoding("UTF-8");
HttpServletResponse
HttpServletResponse这个对象负责返回数据给客户端。
如何解决响应数据中文乱码问题?- 以字符流输出:response.getWriter()
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("你好,世界!");
- 以字节流输出:response.getOutputStream()
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("你好,世界!".getBytes("UTF-8"));
重定向和请求转发
- 重定向
// 第一种:使用示例
response.setStatus(302);
response.setHeader("Location", "login_success.html");*/
// 第二种:使用示例
response.sendRedirect("login_success.html");
- 地址上显示的是最后的那个资源的路径地址。
- 请求次数最少有两次,服务器在第一次请求后,会返回302以及一个地址,浏览器在根据这个地址,执行第二次访问。
- 可以跳转到任意路径,不是自己的工程也可以跳。
- 效率稍微低一点,执行两次请求。
- 后续的请求,没法使用上一次的request存储的数据,或者没法使用上一次的request对象,因为这是两次不同的请求。
- 请求转发
// 使用示例:
request.getRequestDispatcher("login_success.html").forward(request, response);
- 地址上显示的是请求servlet的地址,返回200ok。
- 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作。
- 只能跳转自己项目的资源路径。
- 效率上稍微高一点,因为只执行一次请求。
- 可以使用上一次的request对象。
cookie其实是一份小数据,它是服务器给客户端并且存储在客户端上的一份小数据。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取cookie ============================================================
cookie[] cookies = request.getcookies();
if (cookies.length == 1) {
System.out.println("没有其它cookie存在,只有JSESSIONID这个cookie存在!");
// 创建cookie ============================================================
// 创建cookie对象
cookie cookie = new cookie("username", "wanzi");
// 添加cookie描述
cookie.setComment("用户账号cookie");
// 正值:表示在这个数字过后,cookie将会失效。
// 负值:关闭浏览器,那么cookie就失效,默认值是 -1。
// 注意:cookie是没有删除方法的,想让要cookie失效或清除,就只要让当前值为0就可以了。
cookie.setMaxAge(60 * 60 * 24 * 7);
// 重新为当前的这个cookie赋值
cookie.setValue("lisi");
// 只有访问域名 localhost 才会带上该cookie
cookie.setDomain("localhost");
// 只有访问请求 /myJavaWebDemo_war_exploded/cookieServlet 才会带上该cookie
cookie.setPath("/myJavaWebDemo_war_exploded/cookieServlet");
// 创建cookie ============================================================
// 使用响应对象给浏览器响应的时候带上该cookie
response.addcookie(cookie);
} else {
for (cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
System.out.println(cookie.getName() + "====" + cookie.getValue());
}
}
}
// 获取cookie ============================================================
}
Session
由于cookie会保存在客户端上,所以有安全隐患问题。还有一个问题,cookie的大小与个数有限制。
为了解决这些问题,于是就有了Session。
Session是基于cookie的一种会话机制。
cookie是服务器返回一小份数据给客户端,并且存放在客户端上。
Session是数据存放在服务器端。
// 获取Session对象 HttpSession session = request.getSession(); // 获取SessionID String id = session.getId(); //存值 session.setAttribute(name, value); //取值 session.getAttribute(name); //删值 session.removeAttribute(name);生命周期:
- 创建:如果有在servlet里面调用了 request.getSession()
- 销毁:关闭服务器或者session会话时间过期。默认有效期: 30分钟。



