JavaWeb从入门到精通!第二天!(Servlet)

一、Servlet

1. Java Servlet

Java Servlet 是服务端的一个技术,是对服务器的一种小型可插拔的扩充,用于提高服务器性能,由于使用 Java 语言编写,所以可以跨平台,Servlet 的内部以多线程的方式提供服务,所以不必对每个请求都去创建一个 Servlet 来处理,利用多线程方式一个Servlet就可以给多个请求服务,效率非常高。

2. 开发 Servlet 的方法

要开发自定义的 Servlet,需要继承 javax.servlet.GenericServlet(原生的Servlet) 或 javax.servlet.http.HttpServlet(基于http的Servlet),然后重写父类方法来实现自定义 Servlet,其中GenericServlet 是 HttpServlet 的父类。

2.1 通过继承 GenericServlet 实现自定义 Servlet

2.1.1 eclipse 操作

2.1.2 源码

package com.edu.ctrl;

import java.io.IOException;

import javax.servlet.GenericServlet;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServletRequest;

/**

* @WebServlet("/userServlet"):该注解的作用是指定该 Servlet 的 URL 地址,跟访问 JSP 页面类似,访问该 Servlet

* 的完整 URL 地址就是:http://localhost:8080/javaweb2/userServlet

*/

@WebServlet("/userServlet")

public class UserServlet extends GenericServlet {

private static final long serialVersionUID = 1L;

//UserServlet 的默认构造函数,Web 服务器在创建该 Servlet 实例的时候调用(不是程序员手工调用的)

public UserServlet() {

System.out.println("UserServlet 的默认构造函数被调用");

}

/**

* 以下方都是该 Servlet 的生命周期方法,由Web服务器自动调用,不是程序员手动调用的

* init():UserServlet 的初始化方法,可以完成初始化,该方法是在客户端第一次请求 UserServlet 的时候由服务器调用一次,

* 后续请求就不再调用了,而方法的参数 config 就是 JSP 的内置对象 config

*/

public void init(ServletConfig config) throws ServletException {

// TODO Auto-generated method stub

System.out.println("UserServlet 的 init() 方法");

}

/**

* service():Servlet 的核心服务方法,当客户端请求该 Servlet 的时候,例如发送 GET 或 POST 请求到该 Servlet 的时候,

* Web 服务器就会调用该 service() 方法来响应客户端请求。

* 该方法工作在多线程的环境中,其参数 request 和 response 表示原生的请求和响应对象,不是 HttpServletRequest 和

* HttpServletResponse

*/

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

System.out.println("UserServlet 的 service() 方法");

System.out.println(this);//this 指当前 UserServlet 实例本身

System.out.println("当前线程:" + Thread.currentThread().getName());

}

//当 UserServlet 被销毁的时候自动调用的方法

public void destroy() {

// TODO Auto-generated method stub

System.out.println("UserServlet 的 destroy() 方法");

}

}

2.1.3 测试查看结果

从上面执行结果可知,默认情况下,我们启动服务器的时候,服务器并没有调用 Servlet 的默认构造方法来产生实例。

然后我们第一次请求该页面:

后续再发多次请求:

从上面分析可知,默认情况下,该 Servlet 的实例是在客户端第一请求它的时候由 Tomcat 服务器创建,并且init() 也是在客户端第一次请求该Servlet时被调用一次,以后请求就不在调用。

service() 是在客户端每一次请求的时候都会被 Tomcat 调用一次,来响应客户端请求,并且可以发现Servlet是单例多线程的组件,所以,Servlet 中最好不要包含成员变量,因为可能会有多线程安全问题。

然后我们修改该 Servlet 再保存,那么应用会重新加载 Servlet,destroy() 方法就被调用了,查看控制台信息:

2.1.4 Servlet的生命周期图:

2.2 通过继承 HttpServlet 实现自定义 Servlet

javax.servlet.http.HttpServlet 继承于 GenericServlet,我们平时去继承 HttpServlet 来自定义 Servlet 的方式用的比较多。

有两种方式来定义:

2.2.1 通过注解的方式来定义

HttpUserServlet:

package com.edu.ctrl;

import java.io.IOException;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebInitParam;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* @WebServlet("/httpUserServlet"):该注解的作用是指定该 Servlet 的 URL 地址,跟访问 JSP 页面类似,访问该 Servlet

* 的完整 URL 地址就是:http://localhost:8080/javaweb2/httpUserServlet

* initParams:用于定义初始化参数,其中包含了 @WebInitParam 注解组成的数组,代表每一个初始化参数,可以通过 init() 方法

* 的 config 对象读取

*/

@WebServlet(value = "/httpUserServlet", initParams = {@WebInitParam(name = "param", value = "注解式的初始化参数")})

public class HttpUserServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

//HttpUserServlet 的默认构造函数,默认情况下是客户端第一次请求该 Servlet 的时候由服务器调用一次

public HttpUserServlet() {

super();

// TODO Auto-generated constructor stub

System.out.println("HttpUserServlet 的默认构造函数");

}

/**

* 该 Servlet 的初始化方法,也是客户端第一次请求该 Servlet 的时候由服务器调用一次,完成初始化工作,

* 其参数 config 用于读取初始化参数

*/

public void init(ServletConfig config) throws ServletException {

// TODO Auto-generated method stub

System.out.println("HttpUserServlet 的 init() 方法");

String value = config.getInitParameter("param");

System.out.println("初始化参数:" + value);

}

/**

* 每次 HttpUserServlet 收到客户端的 GET 请求的时候,该方法被 Web 服务器调用一次,其参数 request 和 response 分别

* 表示请求和响应对象,它们和 JSP 中的 request 和 response 是同一个对象。

* 同时 HttpUserServlet 也是单例多线程的

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

System.out.println("HttpUserServlet 的 doGet() 方法");

System.out.println(this);//this 指当前 HttpUserServlet 实例本身

System.out.println("当前线程:" + Thread.currentThread().getName());

}

/**

* 每次 HttpUserServlet 收到客户端的 POST 请求的时候,该方法被 Web 服务器调用一次,其参数 request 和 response 分别

* 表示请求和响应对象,它们和 JSP 中的 request 和 response 是同一个对象。

* 同时 HttpUserServlet 也是单例多线程的

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

System.out.println("HttpUserServlet 的 doPost() 方法");

System.out.println(this);//this 指当前 HttpUserServlet 实例本身

System.out.println("当前线程:" + Thread.currentThread().getName());

}

//当HttpUserServlet 被销毁的时候调用的方法

public void destroy() {

// TODO Auto-generated method stub

System.out.println("HttpUserServlet 的 destroy() 方法");

}

}

form.jsp:由于 URL 地址输入,以及超链接点击都是属于 get 请求,我们写一个表单来做 post 请求

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>form</title>

</head>

<body>

<form action="httpUserServlet" method="post">

<input type="submit" value="提交">

</form>

</body>

</html>

测试:

启动服务器的时候没有创建该Servlet:

然后在浏览器地址栏输入URL地址发送GET请求:

工作流程和 GenericServlet 类似,只是这里是 doGet() 方法来响应客户端请求的。

然后我们使用表单发送 POST 请求:

工作流程和 GenericServlet 也类似,只是是 doPost 方法来响应

可以看出,基于 HttpServlet 的自定义 Servle t也是一个单例多线程的组件,它通过它的 doGet() 和 doPost() 方法来响应客户端的 GET 和 POST 请求。

2.2.2 通过 web.xml(部署描述文件)配置文件来配置 Servlet

注意:注解方式和 web.xml 方式配置 Servlet 只能二选一

第一步:在工程上右键:

第二步:删除 HttpUserServlet 的注解配置,然后在 web.xml 中配置:

测试:

过程和注解方式一样,从运行的日志信息可以看出,Servlet 默认情况下是在用户第一次发送请求之后才去实例化和初始化,而不是在服务器启动时就实例化,这样可以节约内存,但是第一次响应客户端请求的速度变慢了,属于时间换空间。当然我们也可以将其配置成服务器启动时就实例化。

然后 HttpServle t除了有 doGet() 和 doPost() 方法之外,还有如下方法对应 HTTP 的不同请求方式:

doGet():处理 GET 请求,doPost():处理 POST 请求,doPut():处理 PUT 请求,doDelete():处理 DELETE 请求,doHead():处理 HEAD 请求,doOptions():处理 OPTIONS 请求,doTrace():处理 TRACE 请求。

2.2.2.1 初始化参数

Servlet 实例在没有处理任何请求之前,init() 方法会被调用一次,来完成该 Servlet 的初始化工作,该方法包含的参数就是初始化参数,初始化参数可以在web.xml中配置:

示例:web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

<display-name>javaweb2</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<!-- 配置 HttpUserServlet -->

<servlet>

<!-- 配置该Servlet 的名称,名称随意 -->

<servlet-name>HttpUserServlet</servlet-name>

<!-- 配置该 Servlet 的完整类名 -->

<servlet-class>com.edu.ctrl.HttpUserServlet</servlet-class>

<!-- 初始化参数 -->

<init-param>

<!-- 参数名 -->

<param-name>param1</param-name>

<!-- 参数值 -->

<param-value>在 web.xml 中配置的初始化参数1</param-value>

</init-param>

<!-- 初始化参数 -->

<init-param>

<!-- 参数名 -->

<param-name>param2</param-name>

<!-- 参数值 -->

<param-value>在 web.xml 中配置的初始化参数2</param-value>

</init-param>

</servlet>

<!-- 配置 HttpUserServlet 的 URL 地址映射 -->

<servlet-mapping>

<!-- 配置该Servlet 的名称,名称需要和上面的一致 -->

<servlet-name>HttpUserServlet</servlet-name>

<!-- 配置 HttpUserServlet 部署到 Tomcat 的URL 地址,完整地址:http://localhost:8080/javaweb2/httpUserServlet -->

<url-pattern>/httpUserServlet</url-pattern>

</servlet-mapping>

</web-app>

然后在 HttpUserServlet 的 init() 方法中读取:

请求该Servlet 看一下:

2.2.2.2 启动装入优先级

启动装入优先级是指 Servlet容器(Tomcat服务器) 在启动的时候加载 Servlet 的优先顺序,我们可以在 web.xml 中配置来指明启动装入优先级,值越小,优先级越高,启动的时候越靠前。

示例:web.xml

测试:启动服务器,但是不去请求 HttpUserServlet:

可以看出,我们把启动优先级设置为 1 的时候,在服务器启动的时候,还没有发出第一次请求到该 Servle t的时候,该 Servlet 就已经被实例化和初始化,这样属于空间换时间,即我们第一次去请求该 Servlet 的时候速度加快了。

3. Servlet 的请求和响应

3.1 上面的 GenericServlet 的 service() 方法包含两个参数:

3.2 ServletRequest 对象

表示原生的请求对象,当 Servlet 接收到一个请求时,由 Servlet 容器(Tomcat服务器)创建 request 对象并传递给service() 方法参数。

3.2.1 常用方法:

  1. public int getContentLength():获取请求数据部分的长度

  2. pubic String getContentType():获取 MIME 类型

  3. public String getParamter(String name):获取请求参数/表单参数

  4. public String[] getParamterValues(String name):获取请求参数值组成的数组。

  5. public String getRemoteAddr():获取远程主机IP地址

  6. public String getServerName():获取Servlet容器(Tomcat服务器)的名称

  7. public int getServerPort():返回服务器监听的端口号

3.3 HttpServletRequest 对象

表示 request 对象,HttpServlet 的 doGet() 和 doPost() 方法都包含这个参数,这个参数也是当 HttpServlet 接收到客户端请求的时候由 Servlet 容器创建并传递给 doGet() 和 doPost() 方法参数。其中 HttpServletRequest 继承于 ServletRequest,并且还扩展了一些方法:

3.3.1 常用方法

  1. public String getAuthType():返回客户端采用的身份验证方案(如BASIC或SSL)

  2. public Cookie[] getCookies():返回Cookie组成的数组

  3. public String getHeader(String name):返回请求头的值

  4. public Enumeration getHeaders(String name):返回请求头组成的数组

  5. public long getDateHeader(String name),public int getIntHeader(String name):读取指定的请求头的值,分别转换为Date和int类型

  6. public String getRequestURI():返回请求的URI地址

  7. public StringBuffer getRequestURL():返回请求的URL地址

  8. public String getServletPath():返回正在被调用的Servlet路径

  9. public String getContextPath():获取工程上下文路径

  10. public String getMethod():获取请求的方式,GET,POST或PUT等等

示例:HttpUserServlet.java

package com.edu.ctrl;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebInitParam;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class HttpUserServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

//HttpUserServlet 的默认构造函数,默认情况下是客户端第一次请求该 Servlet 的时候由服务器调用一次

public HttpUserServlet() {

super();

// TODO Auto-generated constructor stub

System.out.println("HttpUserServlet 的默认构造函数");

}

/**

* 该 Servlet 的初始化方法,也是客户端第一次请求该 Servlet 的时候由服务器调用一次,完成初始化工作,

* 其参数 config 用于读取初始化参数

*/

public void init(ServletConfig config) throws ServletException {

// TODO Auto-generated method stub

System.out.println("HttpUserServlet 的 init() 方法");

}

/**

* 每次 HttpUserServlet 收到客户端的 GET 请求的时候,该方法被 Web 服务器调用一次,其参数 request 和 response 分别

* 表示请求和响应对象,它们和 JSP 中的 request 和 response 是同一个对象。

* 同时 HttpUserServlet 也是单例多线程的

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

//获取 out 对象

PrintWriter out = response.getWriter();

String requestURI = request.getRequestURI();

out.println("requestURI:" + requestURI);

StringBuffer requestURL = request.getRequestURL();

out.println("requestURL:" + requestURL);

String servletPath = request.getServletPath();

out.println("servletPath:" + servletPath);

String contextPath = request.getContextPath();

out.println("contextPath:" + contextPath);

}

/**

* 每次 HttpUserServlet 收到客户端的 POST 请求的时候,该方法被 Web 服务器调用一次,其参数 request 和 response 分别

* 表示请求和响应对象,它们和 JSP 中的 request 和 response 是同一个对象。

* 同时 HttpUserServlet 也是单例多线程的

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

}

//当HttpUserServlet 被销毁的时候调用的方法

public void destroy() {

// TODO Auto-generated method stub

}

}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

<display-name>javaweb2</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<!-- 配置 HttpUserServlet -->

<servlet>

<!-- 配置该Servlet 的名称,名称随意 -->

<servlet-name>HttpUserServlet</servlet-name>

<!-- 配置该 Servlet 的完整类名 -->

<servlet-class>com.edu.ctrl.HttpUserServlet</servlet-class>

<!-- 启动装入优先级为 1,是一个比较小的数,优先级就比较高 -->

<load-on-startup>1</load-on-startup>

</servlet>

<!-- 配置 HttpUserServlet 的 URL 地址映射 -->

<servlet-mapping>

<!-- 配置该Servlet 的名称,名称需要和上面的一致 -->

<servlet-name>HttpUserServlet</servlet-name>

<!-- 配置 HttpUserServlet 部署到 Tomcat 的URL 地址,完整地址:http://localhost:8080/javaweb2/httpUserServlet -->

<url-pattern>/httpUserServlet</url-pattern>

</servlet-mapping>

</web-app>

测试:直接请求 HttpUserServlet:

3.4 ServletResponse 对象

表示原生的响应对象,也是由 Servlet 容器自动赋值的

3.4.1 常用方法

  1. public String getContentType():获取响应头的MIME类型

  2. public String getCharacterEncoding():获取响应的字符编码

  3. public void setContentType(String type):设置响应头的MIME类型以及字符编码

3.5 HttpServletResponse 对象

即 response 对象,继承于 ServletResponse

3.5.1 常用的方法

  1. public void addCookie(Cookie cookie):添加一个Cookie

  2. public void sendError(int sc):按照指定的状态码返回一个出错消息给客户端

  3. public void sendError(int sc, String message):按照指定的状态码和出错信息返回一个出错消息给客户端

常见的状态码:

  1. public void sendRedirect(String location):重定向

  2. public void setHeader(String name,String value):设置响应头

  3. pubic void setStatus(int sc):设置状态码,例如:response.setStatus(response.SC_OK);

  4. public void flushBuffer():刷新缓冲区

  5. public void int getBufferSize():获取缓冲区大小

  6. public void setBufferSize():设置缓冲区大小

示例:改进之后的登录

  1. 创建数据库表
  1. 创建 JavaBean,要求 JavaBean 的属性名要和表的字段同名,因为后面我们的工具类 DbHelper 要用到反射

package com.edu.beans;

public class User {

private int id;

private String name;

private String pwd;

private int age;

private String sex;

public User() {

// TODO Auto-generated constructor stub

}

public User(String name, String pwd, int age, String sex) {

super();

this.name = name;

this.pwd = pwd;

this.age = age;

this.sex = sex;

}

public User(int id, String name, String pwd, int age, String sex) {

super();

this.id = id;

this.name = name;

this.pwd = pwd;

this.age = age;

this.sex = sex;

}

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 getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + ", age=" + age + ", sex=" + sex + "]";

}

}

  1. 给 Web 工程导入 mysql 驱动,我们需要将 mysql 的驱动拷贝到 Web 工程的 WEB-INF/lib 目录,因为Web 工程在运行的时候会去 WEB-INF/lib 目录中去找第三方的 jar 包,所以必须要放在 WEB-INF/lib 目录中。

eclipse 会自动将 WEB-INF/lib 目录中的 jar 包添加到工程构建路径中,不要自己去添加

  1. 拷贝之前写的 ConnectionFactory 以及 DbHelper 工具类到当前工程中:

5. 登录页面 login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>登录页面</title>

</head>

<body>

<%--

我们给表单请求的 Servlet 的 URL 地址后拼接一个请求参数 action=login 来指明当前的请求是登录请求,同理,

其他的请求(例如查询用户请求,删除用户请求等等),也可以用这种方式来请求该 Servlet,由于 Servlet 是单例多线程的,

我们可以使用一个 Servlet 来响应用户的不同请求,而不是每个不同的请求都去创建一个 Servlet 来处理。

注意:如果 form 的 action 属性附加了请求参数,则 method 不能使 get,因为要报错,只能是 post

--%>

<form action="httpUserServlet?action=login" method="post">

<%--表单元素,我们的请求参数就是这些表单元素的值 --%>

姓名:<input type="text" name="name"> <br>

密码:<input type="password" name="pwd"> <br>

<br>

<input type="submit" value="登录">

</form>

<div style="color:red;"><%=session.getAttribute("errormsg")==null ?"":session.getAttribute("errormsg")%></div>

<%--刷新页面时,不能再显示出错信息,这里就是将 session 域的出错信息删除 --%>

<%session.removeAttribute("errormsg"); %>

</body>

</html>

6. 创建 HttpUserServlet:

package com.edu.ctrl;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.List;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebInitParam;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.edu.beans.User;

import com.edu.utils.DbHelper;

@WebServlet("/httpUserServlet")

public class HttpUserServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

//HttpUserServlet 的默认构造函数,默认情况下是客户端第一次请求该 Servlet 的时候由服务器调用一次

public HttpUserServlet() {

super();

}

public void init(ServletConfig config) throws ServletException {

// TODO Auto-generated method stub

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doPost(request, response); //客户端如果发 GET 请求,也去请求 doPost()

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

//设置字符编码

request.setCharacterEncoding("UTF-8");

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

//获取前端页面发送过来的 action 请求参数来判断是哪一种请求

String action = request.getParameter("action");

switch (action) {

case "login": {//处理登录请求

//获取表单参数

String name = request.getParameter("name");

String pwd = request.getParameter("pwd");

String sql = "select * from users where name=? and pwd=?";

User user = DbHelper.getBean(User.class, sql, name, pwd);

if(user == null) { //没找到记录,登录失败

//往session域中放入errormsg信息

request.getSession().setAttribute("errormsg", "用户名或密码错误,请重新登录!");

//重定向到登录页

response.sendRedirect("login.jsp");

}else { //否则就登录成功

//登录成功就将用户的所有信息查询出来通过表格显示

String sql2 = "select * from users";

List<User> users = DbHelper.getList(User.class, sql2, null);

//将users放入session域

request.getSession().setAttribute("users", users);

request.getSession().setAttribute("name", user.getName());//在放入登录成功的用户名

//重定向到主页显示用户信息

response.sendRedirect("index.jsp");

}

break;

}

case "getusers": {//处理获取用户信息请求

}

break;

case "insertuser": {//处理录入用户信息请求

}

break;

case "deleteuser": {//处理删除用户信息

}

break;

case "updateuser": {//处理更新用户信息请求

}

break;

default:

break;

}

}

//当HttpUserServlet 被销毁的时候调用的方法

public void destroy() {

// TODO Auto-generated method stub

}

}

7. index.jsp:

<%@page import="com.edu.beans.User"%>

<%@page import="java.util.List"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>主页</title>

</head>

<body>

<h1>欢迎回来:<%=session.getAttribute("name") %></h1>

<h3>所有用户信息:</h3>

<table border="1" cellpadding="0" cellspacing="0">

<tr>

<th>编号</th>

<th>姓名</th>

<th>密码</th>

<th>年龄</th>

<th>性别</th>

<th>操作</th>

</tr>

<%

List<User> users = (List<User>)session.getAttribute("users");

for(User user : users){

%>

<tr>

<td><%=user.getId() %></td>

<td><%=user.getName() %></td>

<td><%=user.getPwd() %></td>

<td><%=user.getAge() %></td>

<td><%=user.getSex() %></td>

<td>

<a href="">删除</a>

<a href="">更新</a>

</td>

</tr>

<%

}

%>

</table>

</body>

</html>

  1. 测试:

先测试登录失败:

然后以正确用户密码登录:

相关推荐
TG_yunshuguoji5 小时前
华为云数据仓库服务核心优势指南
数据仓库·云原生·华为云·数据库服务
beijingliushao2 天前
30-Hive SQL-DML-Load加载数据
数据仓库·hive·apache
小Tomkk3 天前
数据仓库命名规范
大数据·数据仓库·spark
weixin_307779134 天前
C#实现Hive到Snowflake数据迁移
开发语言·数据仓库·hive·c#
beijingliushao4 天前
27-数据仓库与Apache Hive-2
数据仓库·hive·hadoop
Y.ppm4 天前
数据仓库知识
数据仓库
beijingliushao4 天前
31-数据仓库与Apache Hive-Insert插入数据
数据仓库·hive·apache
Elieal5 天前
深入浅出:Ajax 与 Servlet 实现前后端数据交互
前端·ajax·servlet
snow@li6 天前
VSCode:基础使用 / 使用积累
java·servlet·jar