一、Java Web

Java语言开发的web应用,Java最主流的研发方向

Servlet 、JSP

Tomcat:Web应用服务器,专门用来运行web程序

二、Tomcat介绍

2.1 安装Tomcat

Tomcat9是主流

尽量用解压版的方式安装tomcat

参考文档:Windows环境下安装Tomcat,并配置环境变量-CSDN博客

bin:启动/关闭Tomcat服务的命令

conf:配置文件

lib:jar包

logs:日志

temp:临时文件

webapps:存放程序

work:JSP文件转换之后的Servlet文件

2.2 Tomcat运行机制

启动一个服务,端口是8080,浏览器通过url可以访问服务,返回该服务中的资源

2.3 手写简易版Tomcat

Socket

Request

Response

响应:根据浏览器所请求的uri去找对应的资源,如果有资源则返回,没有就返回4040错误。

注意:WebContent/tets.html放在根目录下,跟src同级。否则找不到路径

package tomcat;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class MyHttpServer {
    private  int port = 8080;
    //获取当前工程的路径
     static String WebContent =System.getProperty("user.dir") + File.separator + "WebContent";

    public void receiving(){
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(port,1, InetAddress.getByName("127.0.0.1"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //接收请求
        while (true) {
            Socket socket = null;
            InputStream inputStream = null;
            OutputStream outputStream = null;
            try {
                socket = serverSocket.accept();
                inputStream = socket.getInputStream();
                outputStream = socket.getOutputStream();
                //解析请求
                MyHttpRequest request = new MyHttpRequest(inputStream);
                request.parse();
//                System.out.println(request.getUri());
                //做出响应
                MyHttpResponse myHttpResponse = new MyHttpResponse(outputStream);
                myHttpResponse.response(request);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }




    }
}
package tomcat;

import java.io.IOException;
import java.io.InputStream;

public class MyHttpRequest {
    private InputStream inputStream;
    private String uri;

    public MyHttpRequest(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public void parse(){
        StringBuffer stringBuffer = new StringBuffer();
        int i = 0;
        byte[] buff = new byte[1024];
        try {
            i = inputStream.read(buff);
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (int j = 0; j < i; j++) {
            stringBuffer.append(((char) buff[j]));
        }
        System.out.println(stringBuffer.toString());
        uri = ParseUri(stringBuffer.toString());
    }

    public String ParseUri(String stringBuffer){
        int index1,index2;
        index1 = stringBuffer.indexOf(' ');
        index2 = stringBuffer.indexOf(' ',index1+1);
        return stringBuffer.substring(index1+1,index2);
    }

    public String getUri() {
        return uri;
    }
}
package tomcat;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        System.out.println("服务器已启动....");
        MyHttpServer myHttpServer = new MyHttpServer();
        myHttpServer.receiving();
    }
}
package tomcat;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;

public class MyHttpResponse {
    private OutputStream outputStream;

    public MyHttpResponse(OutputStream outputStream) {
        this.outputStream = outputStream;
    }
    public void response(MyHttpRequest request) throws Exception {
        byte[] buff = new byte[1024];
        FileInputStream fileInputStream = null;
        String filePath = request.getUri();
        if(filePath.equals("/")){
            filePath = "/index.html";
        }
        String result = null;
        File file  = new File(MyHttpServer.WebContent,filePath);
        byte[] fileByte = new byte[(int)file.length()];
        if(file.exists()){
            fileInputStream = new FileInputStream(file);
            fileInputStream.read(fileByte);
            fileInputStream.close();
            result = new String(fileByte);
            result = createMsg("200",result);
            outputStream.write(result.getBytes());
        }else {
            String msg = "404 File Not Found";
            String msg1 = createMsg("404", msg);
            outputStream.write(msg1.getBytes());
        }
    }
    public String createMsg(String code,String message){
        return "HTTP/1.1 " + code + "\r\n" + "Content-Length: " + message.length() + "\r\n" + "\r\n" + message; //结果是HTTP/1.1 200 OK\r\nContent-Length: xxx\r\n\r\n内容
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello World</h1>

</body>
</html>

三、创建Java Web项目

idea的版本不同,创建方式可能不同,以idea2025.2版本为例。

3.1 创建Java Web项目

进行搜索"Add Framework",回车,弹框中选择“Web应用程序”

添加项目需要的jar包(jsp、servlet)

步骤:

3.2 添加Tomcat

启动访问 localhost:8080或者localhost:8080/index.jsp

四、Servlet的使用

4.1 前端HTML

HTML+JS+CSS

HTML:组成网页的基础标签

CSS:对网页进行美化

JS:动态操作数据,JS封装库:jQuery

4.1.1 编写网页最基础的标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/index.css">
    <script src="js/jquery3.3.1.min.js"></script>
    <script src="js/index.js"></script>
</head>
<body>
    <div>test</div>
</body>
</html>
div{
    width:300px;
    height:300px;
    border:10px solid blue;
}
$(function(){
    $("div").click(function(){
        alert("点击了div")
    })
})

完整的index.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/index.css">
    <script src="js/jquery3.3.1.min.js"></script>
    <script src="js/index.js"></script>
</head>
<body>
    <div id="mian">
        <form action="/register"  method="post">
        <table id="tab">
            <tr>
                <td class="title">用户名:</td>
                <td>
                   <input type="text"/>
                </td>
            </tr>
            <tr>
                <td class="title">密码:</td>
                <td>
                    <input type="password" />
                </td>
            </tr>
            <tr>
                <td class="title">确认密码:</td>
                <td>
                    <input type="password"/>
                </td>
            </tr>
            <tr>
                <td class="title">性别:</td>
                <td>
                    <input type="radio" name="sex" checked="checked"/>男
                    <input type="radio" name="sex" />女
                </td>
            </tr>
            <tr>
                <td class="title">科目:</td>
                <td>
                   <select>
                    <option>Java</option>
                    <option>Ruby</option>
                    <option>C++</option>
                    <option>Python</option>
                   </select>
                </td>
            </tr>
            <tr>
                <td class="title">爱好:</td>
                <td>
                    <input type="checkbox" name="hobby"/>编程
                    <input type="checkbox" name="hobby"/>画画
                    <input type="checkbox" name="hobby"/>唱歌
                    <input type="checkbox" name="hobby"/>阅读
                </td>
            </tr>
        </table>
         <input id="btn" type="submit" value="提交"></input>
          </form>
    </div>
</body>
</html>

前端UI组件、Element UI 、Echarts 、BaiDuMap

4.2 后端

Java Web提供的后端组件是Servlet

Servlet是一个接口,让Java可以接收网络请求,并且做出响应的功能

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

@WebServlet("/test")
public class ServerTest 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 {
     String StrId = servletRequest.getParameter("id");
        System.out.println("接收到了客户端请求:" + StrId);
        servletResponse.getWriter().write("Hello world");

    }

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

    @Override
    public void destroy() {

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

public class ServletTest extends HttpServlet {
    //接口实现中有5个方法,但是只使用service方法,用service的分支代替

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了Get方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了Post方法");
    }
}

4.3 前后端整合

4.3.1 前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/css/index.css">
<!--    <script src="js/jquery3.3.1.min.js"></script>-->
<!--    <script src="js/index.js"></script>-->
</head>
<body>
<div id="main">
    <form action="/servlet"  method="post">
        <table id="tab">
            <tr>
                <td class="title">用户名:</td>
                <td>
                    <input  name="username" type="text"/>
                </td>
            </tr>
            <tr>
                <td class="title">密码:</td>
                <td>
                    <input name="password" type="password" />
                </td>
            </tr>
            <tr>
                <td class="title">确认密码:</td>
                <td>
                    <input  name="repassword" type="password"/>
                </td>
            </tr>
            <tr>
                <td class="title">性别:</td>
                <td>
                    <input type="radio" name="sex" value="男" checked="checked"/>男
                    <input type="radio" name="sex"  value="女"/>女
                </td>
            </tr>
            <tr>
                <td class="title">科目:</td>
                <td>
                    <select name="type">
                        <option>Java</option>
                        <option>Ruby</option>
                        <option>C++</option>
                        <option>Python</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td class="title">爱好:</td>
                <td>
                    <input type="checkbox" name="hobby" value="编程"/>编程
                    <input type="checkbox" name="hobby" value="画画"/>画画
                    <input type="checkbox" name="hobby" value="唱歌"/>唱歌
                    <input type="checkbox" name="hobby" value="阅读"/>阅读
                </td>
            </tr>
        </table>
        <input id="btn" type="submit" value="提交"></input>
    </form>
</div>
</body>
</html>

4.3.2 后端

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;

@WebServlet("/servlet")
public class ServletTest extends HttpServlet {
    //接口实现中有5个方法,但是只使用service方法,用service的分支代替

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了Get方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("UTF-8");
        System.out.println("调用了Post方法");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String repassword = req.getParameter("repassword");
        String sex = req.getParameter("sex");
        String type = req.getParameter("type");
        String hobby = req.getParameter("hobby");
        System.out.println("结果:" + "用户名是:" + username + "密码:" + password + "确认密码:" + repassword + "性别" + sex + "科目:" + type + "爱好:" + hobby);

    }
}

五、HttpServletRequest

Servlet是Java进行Web开发的基础

Spring MVC基于Servlet

Web接受请求+做出响应。

HttpServlet中,Get请求进入doGet方法,POST方法进入doPost请求

HttpServletRequest表示请求

接收客户端的参数getParameter

设置编码 setCharaterEncoding

url完整的请求路径 http://localhost:8080/test.html

uri具体的资源 test.html

获取Session getSession

session和request一样,都是Java Web提供的对象

session用来存储登陆用户信息

JSP:Java Server Page HTML代码和Java代码的混合体

JSP内置对象,JSP引擎预先为开发者创建好的Java对象,可以直接使用

url中的参数只能通过getParameter方法取出

getAttribute适用于两个资源之间的数据传输,必须先有setAttribute才能通过getAttribute才能取值

资源之间的跳转有两种形式:

转发:getRequestDispatcher

重定向:sendRedirect

5.1 转发和重定向的区别

  • 转发操作request,重定向操作response
  • 转发浏览器地址栏不会改变,重定向浏览器地址栏会改变
  • 转发前后操作的是同一个request对象,重定向前后是两个request对象
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;

@WebServlet("/servlet")
public class ServletTest extends HttpServlet {
    //接口实现中有5个方法,但是只使用service方法,用service的分支代替

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("调用了Get方法");
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("UTF-8");
        System.out.println("调用了Post方法");
        String username = req.getParameter("username");
        System.out.println("请求进入了ServletTest");
//        跳转到index页面,并获取username值
        req.setAttribute("username",username);
        //转发跳转
        req.getRequestDispatcher("index.jsp").forward(req,resp);
    }
}
<%--
  Created by IntelliJ IDEA.
  User: 31982
  Date: 2026/6/1
  Time: 12:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
      <%
        Object username = request.getAttribute("username");
      %>
  </head>
  <body>

<h1><%= username %></h1>
  </body>
</html>

如果通过request进行数据的传递,则必须使用转发,如果使用重定向进行传递,会造成数据丢失。

如果使用重定向的方式进行资源跳转,同时需要数据共享,则需要使用session进行数据存储。

session作用域大于request

业务数据查询,后台查出数据,转发到页面进行展示,使用request存储数据。

登录用户,多个页面多个场景中使用,session存储数据。

5.2 登录演示

5.2.1 login.jsp

<%--
  Created by IntelliJ IDEA.
  User: 31982
  Date: 2026/6/5
  Time: 19:30
  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>
<form action="/login" method="post">
    <table>
        <tr>
            <td>用户名:</td>
            <td>
                <input type="text" name="username"/>
<%--                <%--%>
<%--                    String msg = (String)request.getAttribute("msg");--%>
<%--                    if(msg != null){--%>
<%--                    %>--%>
<%--                <font style = "color:red"><%=msg%> <font>--%>

<%--                <%--%>
<%--                    }--%>
<%--                %>--%>
<%--                    使用EL表达式:简化代码--%>
                    <font style="color: red">${msg}</font>
            </td>
        </tr>
        <tr>
            <td>密码:</td>
            <td>
                <input type="text" name="password"/>
                <font style="color: red">${msg1}</font>
            </td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="登录">
            </td>
        </tr>
    </table>
</form>

</body>
</html>

5.2.2 DBUtils.java

模拟数据库

public class DBUtils {
    public static final String USERNAME = "admin";
    public static final String PASSWORD = "123456";
}

5.2.3 ResponseEbum.java

public enum ResponseEnum {
    //枚举常量必须放在最前面,用逗号分隔,最后加分号
    USERNAME_ERROR("用户名错误"),
    PASSWORD_ERROR("密码错误");
    private String msg;
//    构造方法(必须是 private)
    private ResponseEnum(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

}

5.2.4 LoginServlet.java

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;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if(!username.equals(DBUtils.USERNAME)){
            //给页面提示用户名错误
//            req.setAttribute("msg","用户名错误");
            req.setAttribute("msg",ResponseEnum.USERNAME_ERROR.getMsg());
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
        if(!password.equals(DBUtils.PASSWORD)){
            //给页面提示用户名错误
//            req.setAttribute("msg1","密码错误");
            req.setAttribute("msg",ResponseEnum.PASSWORD_ERROR.getMsg());
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
        //登陆成功,跳转到home页面(先set再转发)
        req.setAttribute("username",username);
        req.getRequestDispatcher("home.jsp").forward(req,resp);
    }
}

5.2.5 home.jsp

<%--
  Created by IntelliJ IDEA.
  User: 31982
  Date: 2026/6/5
  Time: 20:19
  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>

欢迎,${username}<a href="logout">退出</a>
<h1>首页</h1>

</body>
</html>

5.2.6 LogoutServlet.java

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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.invalidate();//销毁
        resp.sendRedirect("login.jsp");
    }
}

六、HttpServletResponse

表示响应

向客户端返回资源数据getWriter().write();

6.1 Servlet和JSP的关系

JSP本质就是一个Servlet,为了方便编写HTML代码,如果用Servlet返回HTML代码,需要拼写多次字符串,如果再添加新的,很容易出错。所以创造了JSP机制。JSP是一个模板,在此模板上可以用开发HTML代码形式写程序,JSP自动转换成一个Servlet,以response的形式将数据返回给客户端。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐