《Java EE》课程笔记(2)

Java Servlet

  • Servlet是一个接口

  • 运行在 Web 服务器或应用服务器

  • 服务器接收来自客户端的请求,然后服务端进行处理,返回给客户端

  • Servlet作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

  • Servlet生命周期:

    • init():初始化操作,比如MySQL的连接
    • service():主要负责处理,进行业务逻辑
    • destroy():比如MySQL的断开

一个实现了Servlet的类应该如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.java.code.class12.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
* @author: dengzhiwen
* @Date: 2020/3/5 8:46
*/
public class TestServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//初始化操作
}

@Override
public ServletConfig getServletConfig() {
return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//业务逻辑的实现
}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

然后我们要在项目web目录中的web.xm中配置servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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>testServlet</servlet-name> <!--name-->
<servlet-class>com.java.code.class12.servlet.TestServlet</servlet-class>
<!--实现了servlet类的位置-->
</servlet>

<servlet-mapping>
<servlet-name>testServlet</servlet-name> <!--与上面的name必须一致-->
<url-pattern>/servletPath</url-pattern> <!--客户端访问的路径-->
</servlet-mapping>
</web-app>

启动项目,便可以访问啦~

HttpServlet

以下内容来自博客

  • HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。

  • 相应的流程

    • 1.Web客户向Servlet容器发出Http请求
    • 2.Servlet容器解析Web客户的Http请求
    • 3.Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息
    • 4.Servlet容器创建一个HttpResponse对象
    • 5.Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象
    • 6.HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
    • 7.HttpServlet调用HttpResponse的有关方法,生成响应数据
    • 8.Servlet容器把HttpServlet的响应结果传给Web客户

    其中HttpServlet首先必须读取Http请求的内容,Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中。

  • 创建HttpServlet过程
    • 继承HttpServlet抽象类
    • 重写HttpServlet的部分方法,如doGet()或doPost()方法
    • 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
    • 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.java.code.class12.servlet;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* @author: dengzhiwen
* @Date: 2020/3/5 8:46
*/
public class TestServletV2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Hello HttpServlet!");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Hello HttpServlet!");
}
}

然后也要在web.xml中配置

访问结果如下

如果以post和get请求的业务逻辑相同,可以在doPost中调用doGet(req,resp);来时post方法访问重定向到get中,但是一般是不一样的,get一般要进行一些资源的请求,而post要进行一些资源的修改

这种方式与之前提到的直接实现servlet接口,一个好处是可以直接拿到request的header,body的一些内容

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TestServletV2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String header = req.getHeader("myHeader"); //请求myHeader
resp.getWriter().println("Hello HttpServlet!" + header);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String param = req.getParameter("id"); //请求id
resp.getWriter().println("Hello HttpServlet!" + param);
}
}

结果如下


当然,如果每实现一个Servlet,web.xml中便需要配置一次,但是这样便太麻烦了,所以javaEE规范中提供了一条注解@WebServlet("/testServlet"),括号内为访问路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.java.code.class12.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* @author: dengzhiwen
* @Date: 2020/3/7 17:05
*/
@WebServlet("/testServlet") // 《====注解,括号内为访问路径
public class TestServletV3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String header = req.getHeader("myHeader");
resp.getWriter().println("Hello HttpServlet!" + header);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String param = req.getParameter("id");
resp.getWriter().println("Hello HttpServlet!" + param);
}
}

也是可以的

JSP

  • JSP的概念
    • JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
    • JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
    • JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
    • JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

JSP通过Servlet访问数据库

当用户访问服务器时,JDBC访问数据库,获取数据,通过Servlet返回给JSP页面,然后JSP页面展示数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<%@ page import="java.util.List" %>
<%@ page import="com.java.code.class12.model.StudentHomework" %><%--
Created by IntelliJ IDEA.
User: litterboy
Date: 2020/2/27
Time: 9:59
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>
<%-- java代码-->
<%
//获取数据
List<StudentHomework> list = (List<StudentHomework>)request.getAttribute("list");

if (list == null || list.size() <= 0){
out.print("None data");
}else {
for (StudentHomework sh : list) {
out.print(sh.getHomeworkContent());
}
}
%>
</body>
</html>

Servlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.java.code.class12.servlet;

import com.java.code.class12.jdbc.StudentHomeworkJDBC;
import com.java.code.class12.model.StudentHomework;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
* @author: dengzhiwen
* @Date: 2020/3/7 18:44
*/
@WebServlet("/list")
public class StudentHomeworkServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<StudentHomework> list = StudentHomeworkJDBC.selectAll();//访问数据库

req.setAttribute("list",list);
req.getRequestDispatcher("index.jsp").forward(req,resp); //将数据展示到index.jsp页面

}
}

JDBC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.java.code.class12.jdbc;

import com.java.code.class12.model.StudentHomework;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
* @author: dengzhiwen
* @Date: 2020/3/7 18:01
*/
public class StudentHomeworkJDBC {

public static List<StudentHomework> selectAll(){
String url = "jdbc:mysql://127.0.0.1:3306/school?serverTimezone=UTC";

String driverName = "com.mysql.cj.jdbc.Driver";

String sqlString = "SELECT * FROM s_student_homework";

try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

List<StudentHomework> list = new ArrayList<>();
try(Connection connection = DriverManager.getConnection(url, "root", "dzw1998")){
try(Statement statement = connection.createStatement()) {
try(ResultSet resultSet = statement.executeQuery(sqlString)){
//获取执行结果
while (resultSet.next()){
StudentHomework sh = new StudentHomework();
sh.setId(resultSet.getLong("id"));
sh.setStudentId(resultSet.getLong("student_id"));
sh.setHomeworkId(resultSet.getLong("homework_id"));
sh.setHomeworkTitle(resultSet.getString("homework_title"));
sh.setHomeworkContent(resultSet.getString("homework_content"));
sh.setCreateTime(resultSet.getTimestamp("create_time"));
sh.setUpdateTime(resultSet.getTimestamp("update_time"));
list.add(sh);
}
}
}
}catch (SQLException e){
e.printStackTrace();
}

return list;
}

}

然后还要有一个模型类,这个模型类是对数据库表的映射

作业管理系统(作业)

作业代码:https://github.com/litterboyDeng/JavaEE-02

系统设计

  • 老师:添加作业,添加学生,查询作业

  • 学生:提交作业

  • 整个系统的流程图为:

  • 添加作业

    • path: /addHomework.jsp

      param type description
      title char(20) 标题
      content string 内容
  • 添加学生

    • path: /addStudent.jsp

      param type description
      id long 学号
      name char(20) 姓名
  • 查询学生提交作业

    • path: /showHomework
  • 查询及提交作业

    • path: /allHomework

更详细的内容均在代码注释中

具体实现页面

首页


添加作业页面


作业添加成功


添加学生页面


添加成功页面


老师查看作业提交详细信息


某次作业提交页面


学生查看作业信息


提交作业页面


提交成功页面

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信