初识Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet架构
Servlet任务
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP(JavaServer Pages)程序的首选。
对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
同时,Tomcat还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。因此我们需要使用Tomcat服务器来学习Servlet。
链接:Tomcat安装教程
Servlet入门实验
实验内容
利用Servlet架构实现用户登录判断。
实验过程
- 在IDEA中创建Web Application项目,并且添加Tomcat Server
- 打开File中的Project Structure,添加mysql-connector-java-8.0.17.jar和servlet-api.jar这两个jar包
- 使用MySql图形界面管理工具创建新表user
- 创建model包,并在此包下创建User类,此类用于封装用户信息
public class User {
private int id;
private String name;
private String password;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
- 创建util包,并在此包下创建DBUtil类,此类用于连接数据库
public class DBUtil {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
//getConnection的三个参数分别为url,username,password,请替换为你的信息
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/dyh?urlSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC", "root", "1214");
return conn;
}
public static void closeAll(ResultSet rs, Statement stmt, Connection conn) throws SQLException{
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
}
- 创建dao包,并在此包下创建UserDao,此类用于执行数据库信息的处理
public class UserDao {
public static User selectByName(String name) {
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstmt = null;
User user = new User();
try{
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement("select * from user where username=?");
pstmt.setString(1, name);
rs = pstmt.executeQuery();
while(rs.next()){
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
user.setPassword(rs.getString(3));
user.setAge(rs.getInt(4));
}
}catch (ClassNotFoundException | SQLException e){
e.printStackTrace();
}finally {
try {
DBUtil.closeAll(rs, pstmt, conn);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return user;
}
}
- 创建service包,并在此类下创建UserService类,此类用于提供前台服务,我们可以看到此类的内容很少,其实根本不需要这个类,但是我们还是这样做了,这是为了更好地进行模块的划分、封装
public class UserService {
public static User selectByName(String name){
return UserDao.selectByName(name);
}
}
- 创建servlet包,并在此包下创建LoginServlet类,此类用于实现用户登录判断
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String password = req.getParameter("password");
User user = UserService.selectByName(name);
if(password.equals(user.getPassword())){
resp.getWriter().write("success");
}else{
resp.getWriter().write("failure");
}
}
}
- 在WEB-INF下新建lib文件夹,并导入mysql-connector-java-8.0.17.jar和jstl-1.2.jar这两个jar包
- 修改web文件夹下的index.jsp文件,用于形成网页页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$客户端$</title>
</head>
<body>
<h1>登录页面</h1>
<form action="/login" method="post">
name:<input name="name" type="text">
password:<input name="password" type="password">
<input type="submit" value="登录">
</form>
</body>
</html>
- 修改web文件夹下的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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>loginServlet</servlet-name>
<!--下一行中的servlet-class中请放入你建好的servlet包中的LoginServlet类-->
<servlet-class>com.yeling.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
- 配置Tomcat Server并运行
结果输出
实验小结
从上述实验中也可以看出,Servlet并不是什么很复杂的东西,事实上,Servlet就是一个Java接口,也就是一个interface。打开IDEA,ctrl + shift + n,搜索Servlet,就可以看到是一个只有5个方法的i接口。那Servlet是干嘛的?很简单,接口的作用是什么?规范。Servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法。Servlet是一个规范,那实现了servlet的类,就能处理请求了吗?答案是,不能。Servlet不会直接和客户端打交道。那请求怎么来到Servlet呢?答案是Servlet容器,比如我们这次试验使用的Tomcat,这也是最常用的一种Servlet容器,任何一种使用Servlet的程序都需要部署到一个容器中,不然Servlet压根不会起作用。tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。