Java Web-Servlet入门详解
一、什么是Servlet
- Servlet简介
ervlet ( Server Applet )是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
二、Servlet的生命周期
2.1 Servle生命周期阶段
- 初始化阶段调用init()方法
- 响应客户请求阶段调用service()方法
- 终止阶段调用destroy0方法
2.2 Servlet生命周期原理
- 新建一个LifeServlet,包含doGet()和doPost()方法
-
response.getWriter( ):获得PrintWriter对象,用于向网页输出字符
-
request.getContextPath( ):获取servlet访问路径中的工程名部分,即/dmj_ servlet1
-
因此,Servlet主要用于业务逻辑处理,JSP用于展示内容。
-
新建LifeServlet类,在中加入以下三个方法:
package com.dmj.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LifeServlet")
public class LifeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("Servlet的init()方法");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Servlet被请求了");
}
@Override
public void destroy() {
System.out.println("Servlet被销毁了");
}
}
- 此时,可以看出第一次打印,init()只调用一次,每次访问请求都会调用service()方法,destroy()只有被销毁的时候才会被调用,并不是关了tomcat服务器,而是将工程从服务器中remove(移除)。
- 这就是Servlet生命周期的三个阶段。
三、HttpServletRequest(请求)与HttpServletResponse(响应)
-
浏览器对服务器的一次访问称之为一次请求,请求用HttpServletRequest对象来表示
-
服务器给浏览器的一次反馈称之为一次响应,响应用HttpServletResponse对象来表示
四、ServletContext与ServletConfig
4.1 概念
- java是一门面向对象的语言,万事万物皆对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext类型。
- 我们可以在web.xml文件中给某一个Servlet配置一 些配置信息,当服务器被启动的时候,这些配置信息就会被封装到某一个ServletConfig对象中去。 因此ServletConfig表示的是某一个Servlet的配置文件
4.2 ServletContext 案例
- ServletContext对象:表示的是整个JavaWeb工程
- 在一个包中创建两个servlet,Demo1Servlet和Demo2Servlet,一个存放数据,一个取出数据
@WebServlet("/Demo1Servlet")
public class Demo1Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取代表某一个JavaWeb工程的ServletContext对象
//Context对象是一个域对象,可以往某一个域对象中存放数据,并且还可以取出存放的数据
ServletContext context = this.getServletContext();
//往context域对象中存放数据
context.setAttribute("username", "张三");
//取出context域对象中的数据
Object result = context.getAttribute("username");
//打印取出的结果
System.out.println(result);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
运行结果,控制台显示:
- context可以代表整个工程,因此往某个context里面存放的数据可以在其他servlet里面取出来
@WebServlet("/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
//取出key=username所对应的值
Object result = context.getAttribute("username");
System.out.println(result);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
运行结果,控制台先清除存放的数据,再取出数据
4.3 ServletConfig案例
-
ServletConfig对象:表示的是某一个Servelt中的配置文件
-
之前配置对外的虚拟路径是通过注解,下面通过xml配置文件来进行配置,在web.xml中添加代码并且设值一些信息:名字encoding、值utf-8。当servlet被启动,这两个参数就会被封装到ServletConfig对象中
<servlet>
<servlet-name>Demo3Servlet</servlet-name>
<servlet-class>com.dmj.servlet.Demo3Servlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Demo3Servlet</servlet-name>
<url-pattern>/Demo3Servlet</url-pattern>
</servlet-mapping>
- 新建一个servlet,Demo3Servlet,需要注意的是:@WebServlet("/Demo3Servlet")得注释掉,不然tomcat将启动失败。
//@WebServlet("/Demo3Servlet")
public class Demo3Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//首先需要获取ServletConfig对象
ServletConfig sc = this.getServletConfig();
//获取sc这个对象中封装的信息
String encoding = sc.getInitParameter("encoding");
//打印结果
System.out.println("encoding="+encoding);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 运行结果,控制台输出:
五、转发与重定向
- 转发与重定向都是实现页面的跳转,也就是说,当我们访问一个servlet的时候,servlet帮我们跳转到另一个JSP页面,跳转就需要转发与重定向来实现。
5.1 转发与重定向的区别
- 实现转发调用的是HttpServletRequest对象中的方法;
实现重定向调用的是HttpServletResponse对象中的方法 - 转发时浏览器中的url地址栏不会发生改变;
重定向时浏览器中的url地址会发生改变 - 转发时浏览器只请求一次服务器;
重定向时浏览器请求两次服务器
5.2 页面跳转例子说明
//通过转发实现跳转
if ("admin".equals(username)&&"123".equals(password)) {
request.getRequestDispatcher("/success.jsp").forward(request, response);
}else {
request.getRequestDispatcher("/fail.jsp").forward(request, response);
}
- 重定向有个特点,需要加入工程名:/dmj_servlet1
//通过重定位实现跳转
if ("admin".equals(username)&&"123".equals(password)) {
response.sendRedirect("/dmj_servlet/success.jsp");
}else {
response.sendRedirect("/dmj_servlet1/fail.jsp");
}
5.3 跳转页面带数据例子
5.3.1 转发
- 新建一个Demo4Servlet
@WebServlet("/Demo4Servlet")
public class Demo4Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//转发带数据给某个JSP页面
request.setAttribute("username", "李四");
request.getRequestDispatcher("/demo.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 新建一个demo.jsp
<title>转发与重定向获取数据</title>
</head>
<body>
<!-- 取出Demo4Servlet中传递过来的数据 -->
<%
String username = (String)request.getAttribute("username");
out.print(username);
%>
</body>
- 运行结果:
5.3.2 重定位
- 新建一个Demo4Servlet
//重定位带数据给某个JSP页面
ServletContext sc = request.getServletContext();
sc.setAttribute("username", "dmj");
response.sendRedirect("/dmj_servlet1/demo.jsp");
- 新建一个demo.jsp
<%
String username = (String)application.getAttribute("username");
out.print(username);
%>
- 运行结果:
六、总结
以上内容是我目前正在学习Java Web做的笔记,在此过程中也有理解以及记录得不到位。如有错误之处,欢迎大家指正,随着知识的存储,以后会对内容进行补充和完善。