一、什么是Servlet
Servlet是在服务器上运行的小程序。
一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序。
二、Tomcat容器等级
三、手写第一个Servlet
注意:页面中的/代表服务器根目录,web.xml中/代表项目根目录,请求重定向的/代表服务器根目录,请求转发的/代表项目根目录。
index.jsp :
超链接地址不能用/servlet/HelloServlet,因为第一个/表示服务器的根目录,而不是上下文地址(项目根目录)。
表单中action=”servlet/HelloServlet”与超链接地址写法相同。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>第一个Servlet</h1>
<hr>
<a href="servlet/HelloServlet" target="_blank">Get请求</a>
<hr>
<form action="servlet/HelloServlet" name="loginForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>
web.xml : url-pattern格式:/servlet/HelloServlet,必须以/开头,表示的是项目根目录
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
</web-app>
servlet.HelloServlet :
请求重定向的地址: resp.sendRedirect(req.getContextPath() + “/index.jsp”);
服务器内部跳转:request.getRequestDispatcher(“/index.jsp”).forward(request, response); 或者使用 “../index.jsp”
编写Servlet的doPost方法时,需要抛出ServletExcpetion和IOException异常。
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GET请求");
resp.setContentType("text/html;charset=UTF-8"); //以html格式响应
PrintWriter out = resp.getWriter();
out.println("<strong>Hello</strong>");
//重定向的地址
resp.sendRedirect(req.getContextPath() + "/index.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST请求");
resp.setContentType("text/html;charset=UTF-8"); //以html格式响应
PrintWriter out = resp.getWriter();
out.println("username: " + req.getParameter("username") + "<br>");
out.println("password: " + req.getParameter("password") + "<br>");
}
}
Servlet3.0新特性(得Tomcat7.0版本及以上)
不会自动在web.xml中生成该Servlet对应的mapping信息,而是在Servlet代码中加入注解@WebServlet
/**
* 注解WebServlet用来描述一个Servlet
* 属性name描述Servlet的名字,可选
* 属性urlPatterns定义访问的URL,或者使用属性value定义访问的URL.(定义访问的URL是必选属性)
*/
@WebServlet(name="",urlPatterns="/xxx")
四、Servlet执行流程与生命周期
Servlet容器装载Servlet:
Tomcat是通过反射来创建servlet实例的
初始化后的Servlet实例长期驻留在服务器内存
Servlet工作流程分为三个阶段。init(初始化),service(运行),destroy(销毁)
Servlet没有main方法,所有行为由Container控制。Container就是一个java程序。
在加载Servlet的.class后,Servlet会由构造函数生成一个实例,然后Container调用init()方法完成参数的初始化,接着调用service()方法,service会根据网页的请求,调用doGet或者doPost方法,最后调用销毁方法。整个流程如下图:
五、Servlet与JSP九大内置对象
六、Servlet与JSP比较
1> JSP也是Servlet,它其实就是为了能够更方便的输出数据到客户端,JSP能做的事,只要不怕费事,Servlet一样可以完成。
2> Servlet是被Context的类加载器加载的,所以重写Servlet需要重新部署Context,JSP有自己的加载器,所以在你修改了JSP文件之后,没感觉服务器有什么动作,修改内容就显示出来了。
3> JSP封装了大量Servlet中的对象,例如Request,ServletContext,Session等,使用起来极其方便。
4> JSP是 可视化文件,Servlet会被编译成class文件,前者可以拿任何一个编辑器修改,后者不行
理解以下三点即可:
1、不同之处在哪?
Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容
JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
2、各自的特点
Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的
3、通过MVC双剑合璧
既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
Controller——负责转发请求,对请求进行处理(Servlet)
View——负责界面显示(JSP)
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现(JavaBeans)
在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:
web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。
七、获取初始化参数
在web.xml中可以配置servlet初始化参数。在servlet中可以通过ServletConfig接口来获取这些参数。
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet-mapping>
<servlet-name>TestServlet1</servlet-name>
<url-pattern>/servlet/TestServlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestServlet1</servlet-name>
<servlet-class>servlet.TestServlet1</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>mook</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
TestServlet1.java :
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
System.out.println("TestServlet1的init()方法...");
System.out.println(this.getInitParameter("username"));
System.out.println(this.getInitParameter("password"));
System.out.println(this.getServletConfig().getInitParameter("username"));
}
启动服务器,部署项目:
TestServlet1构造方法....
TestServlet1的init()方法...
mook
123456
mook