请求对象

返回值 方法名           说明
String getContextPath() 获取虚拟目录名称
String getServletPath() 获取Servlet映射路径
String getRemoteAddr()  获取访问者ip地址
String getQueryString() 获取请求的消息数据
String getRequestURI()  获取统一资源标识符
String getRequestURL()  获取统一资源定位符
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(name = "demo1GetPath", value = "/demo1GetPath")
public class Demo1GetPath 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 {

        String contextPath = req.getContextPath();
        System.out.println(contextPath);

        String servletPath = req.getServletPath();
        System.out.println(servletPath);

        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);

        String queryString = req.getQueryString();
        System.out.println(queryString);

        String requestURI = req.getRequestURI();
        System.out.println(requestURI);

        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL);
    }
}

请求头信息

返回值              方法名                  说明
String              getHeader(String.name)  根据请求头名获取一个值
Enumeration<String> getHeaders(String.name) 根据请求头名获取多个值
Enumeration<String> getHeaderNames()        获取所有请求头名称
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.Enumeration;

@WebServlet(name = "demo2GetPath", value = "/demo2GetPath")
public class Demo2GetPath 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 {

        String host = req.getHeader("Host");
        System.out.println(host);

        Enumeration<String> headers = req.getHeaders("Accept-Encoding");
        System.out.println("----------------------------------------------");
        while (headers.hasMoreElements()){
            String header = headers.nextElement();
            System.out.println(header);
        }
        Enumeration<String> headerNames = req.getHeaderNames();
        System.out.println("================================");
        while (headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            System.out.println(headerName+"...."+ req.getHeader(headerName));
        }
    }
}

获取请求参数信息

返回值               方法名                          说明
String               getParameter(String.name)       根据名称获取数据
String[]             getParameterValues(String.name) 根据名称获取所有数据
Enumeration<String>  getParameterNames()             获取所有名称
Map<String,String[]> getParameterMap()               获取所有参数的键值对
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.Enumeration;
import java.util.Map;

@WebServlet(name = "Demo3GetRequestParamter", value = "/demo3GetRequestParamter")
public class Demo3GetRequestParamter extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(name+"..."+password);
        System.out.println("----------------");

        String[] hobbies = req.getParameterValues("hobby");
        for(String hobby:hobbies){
            System.out.println(hobby);
        }
        System.out.println("====================");

        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String pname = parameterNames.nextElement();
            System.out.println(pname);
        }
        System.out.println("===================");

        Map<String, String[]> parameterMap = req.getParameterMap();
        for(Map.Entry<String,String[]> parameter : parameterMap.entrySet()){
            System.out.print(parameter.getKey());
            for(String s:parameter.getValue()){
                System.out.print(","+s);
            }
            System.out.println();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

获取请求参数并封装对象

  • 手动封装方式
  • 反射封装方式
  • 工具类封装方式

手动封装的方式

import java.util.Arrays;

public class Student {
    private String username;
    private String password;
    private String[] hobby;
    public Student(){}
    public Student(String username, String password, String[] hobby) {
        this.username = username;
        this.password = password;
        this.hobby = hobby;
    }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
    public String[] getHobby() { return hobby; }
    public void setHobby(String[] hobby) { this.hobby = hobby; }
    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
}
import com.bean.Student;

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.Enumeration;
import java.util.Map;

@WebServlet(name = "demo4GetQequestStudent", value = "/demo4GetQequestStudent")
public class Demo4GetQequestStudent extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");
        Student student = new Student(name,password,hobby);
        System.out.println(student);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

反射封装方式

import com.bean.Student;

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.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

@WebServlet(name = "demo5GetQequestStudent", value = "/demo5GetQequestStudent")
public class Demo5GetQequestStudent extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String,String[]> map = req.getParameterMap();
        Student stu = new Student();

        for(String name : map.keySet()){
            String[] values = map.get(name);

            try {
                PropertyDescriptor pd = new PropertyDescriptor(name, stu.getClass());
                Method writeMethod = pd.getWriteMethod();
                if( values.length>1){
                    writeMethod.invoke(stu,(Object)values);

                }else{
                    writeMethod.invoke(stu, values);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println(stu);

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

工具类封装

在webapp/lib/中添加commons-beanutils-1.9.4.jar和commons-logging-1.2.jar

在本机的tomcat目录中lib目录也要添加上面2个文件

是在我的电脑或者Finder中添加到tomcat目录中lib里上面2个文件

否则提示如下问题

java.lang.NoClassDefFoundError: org/apache/commons/beanutils/BeanUtils
    com.lizicai.servlet.Demo6GetQequestStudent.doGet(Demo6GetQequestStudent.java:25)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
import com.bean.Student;
import org.apache.commons.beanutils.BeanUtils;

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.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet(name = "demo6", value = "/demo6")
public class Demo6GetQequestStudent extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String,String[]> map = req.getParameterMap();
        Student stu = new Student();

        try {
            BeanUtils.populate(stu, map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        System.out.println(stu);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

流对象获取请求信息( 了解即可 )

返回值             方法名         说明
BufferedReader     getReader()    获取字符输入流
ServletInputStream getInputStream 获取字节输入流

** 流对象仅支持Post, 不支持Get**

import com.example.javaweb_test3.HelloServlet;

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

@WebServlet(value = "/demo7")
public class Demo7StreamPost extends HelloServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        BufferedReader br = req.getReader();
        String line;
        while (( line = br.readLine()) != null){
            System.out.println(line);
        }

        System.out.println("------------------");
        byte[] arr = new byte[1024];
        int len;
        ServletInputStream sis = req.getInputStream();
        while ( (len = sis.read(arr)) != -1){
            System.out.println(new String(arr,0,len));
        }

    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        super.doGet(request, response);
    }
}

Post 请求中文乱码问题

  • GET 方式, 没有乱码, 在Tomcat8版本后已经解决
  • POST 方式, 有乱码问题. 可以通过setCharacterEncoding()方法来解决
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(value = "/demo8")
public class Demo8TestUTF8 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

请求域

  • 请求域(request域) 可以在一次请求范围内进行共享数据.
  • PC请求 -> ServletA -> ServletB
  • 请求对象操作共享数据方法
返回值 方法名 说明
void setAttribute(String.name,Object.value) 向请求域对象存储数据
Object getAttribute(String.name) 通过名称获取请求域对象的数据
void removeAttribute(String.name) 通过名称移除请求域对象中的数据

请求转发, 客户端的一次请求到达后, 发现需要借助其他Servlet来实现啊啊练车

  • 特点
    • 浏览器地址栏不变
    • 域对象中的数据不丢失
    • 负责转发的Servlet转发前后的响应正文会丢失,(转发的Servelet不能响应)
    • 由转发的目的地来响应客户端
返回值           方法名                                            说明
RequestDispacher getRequestDispatcher(String.name)                 获取请求高度对象

void             forward(ServletResquest.req,ServletRestpose.resp) 实现转发
import javax.servlet.RequestDispatcher;
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(value = "/demo9")
public class Demo9Froward extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("name", "isnewname");

        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo10");
        requestDispatcher.forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}
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(value = "/demo10")
public class Demo10Froward extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object name = req.getAttribute("name");
        System.out.println(name);

        System.out.println("demo10");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

请求包含

  • 请求包含: 可以合并其他Servlet中的功能一起响应给客户端
  • 特点:
    • 浏览器地址栏不变
    • 域对象中的数据不丢失
    • 被包含的Servlet响应头会丢失,( 转发的Servlet不能响应 )
返回值            方法名                            说明
RequestDispatcher getRequestDispatcher(String.name) 获取请求高度对象
void include(ServletResquest.req,ServletRestpose.resp) 实现包含
import javax.servlet.RequestDispatcher;
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(value = "/demo11")
public class Demo11Froward extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("name", "isnewname");
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo12");
        requestDispatcher.include(req, resp);
        System.out.println("demo11");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}
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(value = "/demo12")
public class Demo12Froward extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object name = req.getAttribute("name");
        System.out.println(name);

        System.out.println("demo12");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

响应对象

  • 响应: 回馈结果. 在BS架构中, 就是服务器给客户端浏览器反馈结果
  • 响应对象: 就是在项目中用于发送响应的对象.
  • ServletResponse 和 HttpServletResponse
状态码 说明
200    成功
302    重定向
304    请求资源未改变,使用缓存
400    请求错误,常见于请求参数错误
404    请求资源未找到
405    请求方式不支持
500    服务器错误
返回值              方法名                                    说明
ServletOutputStream getOutputStream()                         获取响应字节输出流对象
void                setContentType("text/html;charset=UTF-8") 设置响应内容类型,解决中文乱码问题
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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(value = "/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");

        ServletOutputStream sos = resp.getOutputStream();
        String str = "哈哈";
        sos.write(str.getBytes());
    }
}
返回值      方法名                                    说明
PrintWriter getWriter()                               获取响应输入流对象
void        setContentType("text/html;charset=UTF-8") 设置响应内容类型,解决中文乱码
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.io.PrintWriter;

@WebServlet(value = "/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        String str = "你好";

        PrintWriter pw = resp.getWriter();
        pw.write(str);
    }
}

响应图片

  • 创建字节输入流对象, 关联读取的图片路径
  • 通过响应对象获取字节输出流对象
  • 循环读取和写出图片

图片路径,由相对路径获取到war包的绝对路径,才能访问到

其他资源也是一样的方式

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

@WebServlet(value = "/responseDemo3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String realPath = getServletContext().getRealPath("/img/Steve_Halama.jpg");

        System.out.println(realPath);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream
                (realPath));

        ServletOutputStream outputStream = resp.getOutputStream();
        int len;
        byte[] arr = new byte[8192];
        while ( (len = bis.read(arr)) != -1){
            outputStream.write(arr,0,len);
        }
    }
}

设置缓存

  • 缓存: 对象不经常变化的数据, 我们可以设置合理缓存时间, 以避免浏览器频繁请求服务器. 以此提高效率.
返回值 方法名                               说明
void   setDateHeader(String.name,long.time) 设置消息头添加缓存

Chrome无效

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

@WebServlet(value = "/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/html;charset=UTF-8");

        resp.setDateHeader("Expires",System.currentTimeMillis()+5*60*1000);
        resp.getWriter().println("缓存");

        System.out.println("请求一次");
    }
}

定时刷新

返回值 方法名 说明
void setHeader(String.name,String.value) 设置消息头定时刷新
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(value = "/responseDemo5")
public class ResponseDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str = "你的用户名或密码有误, 3秒后自动跳转登录页~";

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write(str);

        resp.setHeader("Refresh", "3;URL=/stu/login/register.html");

    }
}

请求重定向

  • 请求重定向: 客户端的一次请求到达后, 发现需要借助其他Servlet来实现功能
  • 特点: 浏览器地址栏会发生改变, 两次请求, 请求域对象中不能共享数据, 可以重定向到其他服务器
  • 重写向实现原理
    • 设置响应状态码为302 resp.setStatus(302)
    • 设置响应的资源路径(响应到哪里去, 通过响应消息头location来指定)resp.setHeader(“location”,"/stu/responseDemo7")
返回值 方法名 说明
void sendRedirect(String.name) 设置重定向
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(value = "/responseDemo6")
public class ResponseDemo6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("name","zhangsan");

        resp.sendRedirect(req.getContextPath() +"/responseDemo7");
        resp.sendRedirect("http://baidu.com");
    }
}
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(value = "/responseDemo7")
public class ResponseDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Object name = req.getAttribute("name");
        System.out.println(name);
    }
}

文件下载

  • 创建字节输入流, 关联文件
  • 设置响应消息头支持的类型
  • 设置响应消息头f以下载方式打开资源
  • 通过响应对象获取字节输出流对象
  • 循环读写
  • 释放资源
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@WebServlet( value = "/responseDemo8")
public class ResponseDemo8 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String realPath = getServletContext().getRealPath("/img/Steve_Halama.jpg");

//        Content-Type 消息头名称, 支持的类型
//        application/octet-stream消息头参数 应用类型为字节流
        resp.setHeader("Content-Type", "application/octet-stream");

//        Content-Disposition  消息头名称 处理的形式
//        attachment;filename=Steve_Halama.jpg 消息头参数 附件形式处理 指定下载文件名称
        resp.setHeader("Content-Disposition", "attachment;filename=Steve_Halama.jpg");

        InputStream in = new FileInputStream(realPath);
        BufferedInputStream bis = new BufferedInputStream(in);
        byte[] arr = new byte[10240];
        int len;
        ServletOutputStream sos = resp.getOutputStream();
        while ( (len = bis.read(arr)) != -1){
            sos.write(arr,0,len);
        }

        bis.close();
    }
}

案例 学生管理系统

  • 首页, 2个超链接, 添加学生, 查看学生
  • 添加学生, 添加成功后自动跳转到首页
  • 查看学生
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<a href="login/addStudent.html">添加学生</a> <a href="/stu/studentList">查看学生</a>
<br/>
<%--<a href="hello-servlet">Hello Servlet</a>--%>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加学生</title>
</head>
<body>
<form method="post" action="/stu/studentAdd" autocomplete="off">
  <label for="username">学生姓名:</label>
    <input type="text" name="username" id="username">
    <br/>
    <label for="age">学生年龄:</label>
    <input type="text" name="age" id="age">
    <br/>
    <label for="chenji">学生成绩:</label>
    <input type="text" name="chenji" id="chenji">
    <br/>
    <button type="submit">保存</button>
</form>
</body>
</html>
public class Student {
    private String name;
    private int age;
    private int chenji;
    public Student(){}

    public Student(String name, int age, int chenji) {
        this.name = name;
        this.age = age;
        this.chenji = chenji;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getChenji() {
        return chenji;
    }

    public void setChenji(int chenji) {
        this.chenji = chenji;
    }

    @Override
    public String toString() {
        return
                 name + "," +
                 age +","+
                chenji ;
    }
}
import com.lizicai.bean.Student;

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

/**
 * 写入学生
 */
@WebServlet(value = "/studentAdd")
public class StudentAdd extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        Student s = new Student();
        s.setName(req.getParameter("username"));
        s.setAge( Integer.parseInt(req.getParameter("age")) ) ;
        s.setChenji(Integer.parseInt(req.getParameter("chenji")));


        String realPath = getServletContext().getRealPath("/img/student.txt");

        Writer out;
        PrintWriter pw = new PrintWriter(new FileWriter(realPath,true));
        pw.println(s);
        pw.close();

        String str = "添加用户成功, 2秒后自动学生添加页~";

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write(str);

        resp.setHeader("Refresh", "3;URL=/stu/index.jsp");
    }
}
import com.lizicai.bean.Student;

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.*;
import java.util.ArrayList;

/**
 * 查询学生信息
 */

@WebServlet(value = "/studentList")
public class StudentList 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 {

        String realPath = getServletContext().getRealPath("/img/student.txt");
        ArrayList<Student> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader(realPath));
        String line;
        while ( (line = br.readLine()) != null ){
            String[] split = line.split(",");
            Student s = new Student();
            s.setName(split[0]);
            s.setAge(Integer.parseInt(split[1]));
            s.setChenji(Integer.parseInt(split[2]));
            list.add(s);
        }


        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = resp.getWriter();
        for(Student s : list){
            pw.print(s);
            pw.write("<br/>");
        }
    }
}