(在一个完整的项目架构中,servlet的角色和位置)
Servlet、GenericServlet和HttpServlet三者之间的关系是Java Web开发中的一个重要概念,它们共同构成了基于Java的服务器端程序的基础。以下是具体分析:
1. Servlet接口:
- 提供了生命周期方法init()、service()、destroy()和其他用于获取配置信息的方法。
- 是所有Servlet的根,定义了Servlet的基本框架和必须实现的方法。
2. GenericServlet抽象类:
- 实现了Servlet接口,并提供了这些方法的默认实现,包括init()和destroy()方法的空实现。
- 是一个抽象类,要求继承它的自定义Servlet类必须实现service()方法。
3. HttpServlet抽象类:
- 继承自GenericServlet,进一步简化了HTTP特定的处理,例如get和post请求的处理。
- 包含了处理HTTP协议的方法,如doGet()、doPost()等,使得创建特定于HTTP的Servlet变得简单。
总的来说,这三者的关系和特性,为Java Web开发提供了强大的动态内容生成能力,允许开发者根据HTTP请求的类型和内容,灵活地生成响应。在实际开发中,选择合适的父类继承或实现相应的接口,可以大大影响Servlet的开发效率和应用的性能
下面是案例:
在web目录下创建login.jsp文件并写入前端要显示的页面。
<%--
Created by IntelliJ IDEA.
User: 21222
Date: 2024/7/29
Time: 上午10:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div class="box" style="width: 250px; height: 300px; background-color: bisque">
<h1>学生信息管理系统登录页</h1>
<%--
这里的action就是webservlet注解里写的名字,运行后会自动到后端寻找
method就是请求方法post或者get
--%>
<form action="login" method="post">
账号<input type="text" name="user">
<br>
密码<input type="text" name="pw">
<br>
<button>登录</button>
</form>
</div>
</body>
</html>
webServlet注解一定要加 / 否则运行会报工件错误!!!
如果需要接受中文参数到后端,在处理参数的第一行就要对编码进行设置,设置如下。
在这里进行逻辑判断,账号密码输入正确跳转到LoginSuccess错误就跳转到LoginFailed
注:这里从数据库获取数据我用的是mybatis,测试随意
@WebServlet("/login")
public class UserRes extends HttpServlet {
//收参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
String user = req.getParameter("user");
String pw = req.getParameter("pw");
System.out.println("user = " + user);
System.out.println("pw = " + pw);
List<Admin> admin = GetMapper.mapper.selectAdmin(user, pw);
if (!admin.isEmpty()) {
req.getRequestDispatcher("LoginSuccess").forward(req, resp);
} else
req.getRequestDispatcher("LoginFailed").forward(req, resp);
}
}
当login失败时跳转到这个界面,通过后端渲染数据,传给前端
@WebServlet("/LoginFailed")
public class LoginFailed extends HttpServlet {
//收参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求的字符编码为UTF-8,以确保接收到的数据正确解码。
//设置响应的内容类型为"text/html;charset=utf-8",告诉浏览器返回的内容是HTML格式,并使用UTF-8字符集。
//获取响应的PrintWriter对象,用于向客户端发送数据。
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter wr = resp.getWriter();
wr.write("<!DOCTYPE html>");
wr.write("<html>");
wr.write("<head>");
wr.write("<meta charset=\"utf-8\">");
wr.write("<title>Login Failed</title>");
wr.write("</head>");
wr.write("<body>");
wr.write("<h1 style='color:red; font-weight:bold'>Login Failed</h1>");
wr.write("</body>");
wr.write("</html>");
}
}
当login成功时跳转到这个界面。
@WebServlet("/LoginSuccess")
public class LoginSuccess extends HttpServlet {
//收参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("\"登录成功!!\" = " + "登录成功!!");
ArrayList<Student> students = GetMapper.mapper.selectAll();
System.out.println("students = " + students);
}
}