300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > JavaWeb学习笔记之——Servlet HTTP Request

JavaWeb学习笔记之——Servlet HTTP Request

时间:2024-03-03 22:59:14

相关推荐

JavaWeb学习笔记之——Servlet  HTTP  Request

Servlet & HTTP & Request

文章目录

Servlet & HTTP & Request1、Servlet 体系结构2、HTTP2.1、概念2.2、请求消息数据格式2.2.1、请求行2.2.2、请求头:客户端浏览器告诉服务器一些信息2.2.3、请求空行2.2.4、请求体(正文)3、Request3.1、request 对象和 response 对象的原理3.2、request 对象继承体系结构3.3、request 功能3.3.1、获取请求消息数据3.3.2、其他功能4、用户登录4.1、需求分析4.2、分析4.3、开发步骤4.3.1、创建项目,导入 html 页面,配置文件,jar 包4.3.2、创建数据库环境4.3.3、创建包 domain,创建类 User4.3.4、创建包 util,编写工具类 JDBCUtils4.3.5、创建包 dao,创建类 UserDao,提供 login 方法测试类 Test4.3.6、编写 web.servlet.LoginServlet 类4.3.7、编写 FailServlet 和 SuccessServlet 类4.3.8、login.html 中 form 表单的 action 路径的写法4.3.9、BeanUtils 工具类,简化数据封装

1、Servlet 体系结构

Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet -- 抽象类

GenericServlet:将 Servlet 接口中其他的方法做了默认空实现,只将service()方法作为抽象

将来定义 Servlet 类时,可以继承 GenericServlet,实现service()方法即可。

package com.example.servlet_http;import javax.servlet.GenericServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebServlet;import java.io.IOException;@WebServlet("/demo02")public class ServletDemo2 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("demo02...");}}

HttpServlet:对 http 协议的一种封装,简化操作

定义类继承 HttpServlet复写doGet/doPost方法

package com.example.servlet_http;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("/demo03")public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet......");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost......");}}

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="/li/demo03" method="post"><input name="username"><input type="submit" value="提交"></form></body></html>

Servlet 路径配置:

urlpartten:Servlet 访问路径

一个 Servlet 可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})

路径定义规则:

/xxx:路径匹配/xxx/xxx:多层路径,目录结构*.do:扩展名匹配

2、HTTP

2.1、概念

Hyper Text Transfer Protocol 超文本传输协议

传输协议:定义了,客户端和服务器端通信时,发送数据的格式特点: 基于 TCP/IP 的高级协议默认端口号:80基于请求/响应模型的:一次请求对应一次响应无状态的:每次请求之间相互独立,不能交互数据 历史版本 1.0:每一次请求响应都会建立新的连接1.1:复用连接

2.2、请求消息数据格式

字符串形式:

POST /login.htmlHTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/0101 Firefox/60.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://localhost/login.htmlConnection: keep-aliveUpgrade-Insecure-Requests: 1username=zhangsan

2.2.1、请求行

请求方式 请求url 请求协议/版本

GET /login.html HTTP/1.1

请求方式:

HTTP 协议有 7 中请求方式,常用的有 2 种

GET: 请求参数在请求行中,在 url 后请求的 url 长度有限制的不太安全 POST: 请求参数在请求体中请求的 url 长度没有限制的相对安全

2.2.2、请求头:客户端浏览器告诉服务器一些信息

请求头名称: 请求头值

常见的请求头:

User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息

可以在服务器端获取该头的信息,解决浏览器的兼容性问题

Referer:http://localhost/login.html

告诉服务器,我(当前请求)从哪里来?

作用:

防盗链;统计工作。

2.2.3、请求空行

空行,就是用于分割 POST 请求的请求头,和请求体的。

2.2.4、请求体(正文)

封装 POST 请求消息的请求参数的。

3、Request

3.1、request 对象和 response 对象的原理

request 和 response 对象是由服务器创建的。我们来使用它们;request 对象是来获取请求消息,response 对象是来设置响应消息。

3.2、request 对象继承体系结构

ServletRequest--接口|继承HttpServletRequest-- 接口|实现org.apache.catalina.connector.RequestFacade 类(tomcat)

3.3、request 功能

3.3.1、获取请求消息数据

获取请求行数据

GET /day14/demo1?name=zhangsan HTTP/1.1

方法:

获取请求方式 :GET

String getMethod()

(*)获取虚拟目录:/day14

String getContextPath()

获取 Servlet 路径: /demo1

String getServletPath()

获取 get 方式请求参数:name=zhangsan

String getQueryString()

(*)获取请求 URI:/day14/demo1

String getRequestURI():/day14/demo1

StringBuffer getRequestURL():http://localhost/day14/demo1

URL:统一资源定位符 : http://localhost/day14/demo1 范围更小URI:统一资源标识符 : /day14/demo1 范围更大

获取协议及版本:HTTP/1.1

String getProtocol()

获取客户机的 IP 地址:

String getRemoteAddr()

package com.example.request;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "RequestDemo1", value = "/RequestDemo1")public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*1. 获取请求方式 :GET* String getMethod()2. (*)获取虚拟目录:/day14* String getContextPath()3. 获取Servlet路径: /demo1* String getServletPath()4. 获取get方式请求参数:name=zhangsan* String getQueryString()5. (*)获取请求URI:/day14/demo1* String getRequestURI():/day14/demo1* StringBuffer getRequestURL() :http://localhost/day14/demo1* URL:统一资源定位符 : http://localhost/day14/demo1中华人民共和国* URI:统一资源标识符 : /day14/demo1共和国6. 获取协议及版本:HTTP/1.1* String getProtocol()7. 获取客户机的IP地址:* String getRemoteAddr()*///1. 获取请求方式 :GETString method = request.getMethod();System.out.println(method);//2. (*)获取虚拟目录String contextPath = request.getContextPath();System.out.println(contextPath);//3. 获取Servlet路径String servletPath = request.getServletPath();System.out.println(servletPath);//4. 获取get方式请求参数String queryString = request.getQueryString();System.out.println(queryString);//5. (*)获取请求URIString requestURI = request.getRequestURI();System.out.println(requestURI);StringBuffer requestURL = request.getRequestURL();System.out.println(requestURL);//6. 获取协议及版本String protocol = request.getProtocol();System.out.println(protocol);//7. 获取客户机的IP地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}

GET/li/RequestDemo1null/li/RequestDemo1http://localhost/li/RequestDemo1HTTP/1.1127.0.0.1

获取请求头数据

方法:

(*)通过请求头的名称获取请求头的值

String getHeader(String name)

获取所有的请求头名称

Enumeration<String> getHeaderNames()

package com.example.request;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.util.Enumeration;@WebServlet(name = "RequestDemo2", value = "/RequestDemo2")public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取所有的请求头名称Enumeration<String> headerNames = request.getHeaderNames();//2.遍历while (headerNames.hasMoreElements()){String name = headerNames.nextElement();//根据名称来获取请求头的值String value = request.getHeader(name);System.out.println(name + "---"+ value);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}

host---localhostuser-agent---Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/0101 Firefox/93.0accept---text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8accept-language---zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2accept-encoding---gzip, deflateconnection---keep-alivecookie---JSESSIONID=1054B278492E9FFFD91E7ED1E08F3E44; Idea-4a52b52f=c9dff481-e75e-4f70-a49a-8d1b5dd20856upgrade-insecure-requests---1sec-fetch-dest---documentsec-fetch-mode---navigatesec-fetch-site---nonesec-fetch-user---?1

更具体的演示:

package com.example.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;import java.util.Enumeration;@WebServlet(name = "RequestDemo3", value = "/RequestDemo3")public class RequestDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据: user-agentString agent = request.getHeader("user-agent");//判断agent的浏览器版本if (agent.contains("Chrome")){//谷歌System.out.println("谷歌来了...");}else if (agent.contains("Firefox")){System.out.println("火狐来了...");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}

package com.example.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(name = "RequestDemo4", value = "/RequestDemo4")public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据: refererString referer = request.getHeader("referer");System.out.println(referer);//防盗链if (referer != null){if (referer.contains("/li")){//正常访问System.out.println("正常访问,播放电影...");}else {//盗链System.out.println("想看电影吗?");}}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}

获取请求体数据

请求体:只有 POST 请求方式,才有请求体,在请求体中封装了 POST 请求的请求参数。

步骤:

获取流对象

BufferedReader getReader():获取字符输入流,只能操作字符数据

ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

再从流对象中拿数据

package com.example.request;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.BufferedReader;import java.io.IOException;@WebServlet(name = "RequestDemo5", value = "/RequestDemo5")public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求消息体——请求参数//1.获取字符流BufferedReader br = request.getReader();//2.读取数据String line = null;while ((line = br.readLine()) != null){System.out.println(line);}}}

3.3.2、其他功能

获取请求参数通用方式:不论 get 还是 post 请求方式都可以使用下列方法来获取请求参数

String getParameter(String name):根据参数名称获取参数值username=zs&password=123String[] getParameterValues(String name):根据参数名称获取参数值的数组hobby=xx&hobby=gameEnumeration<String> getParameterNames():获取所有请求的参数名称Map<String,String[]> getParameterMap():获取所有参数的 map 集合

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>注册页面</title></head><body><form action="/li/RequestDemo6" method="get"><input type="text" placeholder="请输入用户名" name="username"><br><input type="text" placeholder="请输入密码" name="password"><br><input type="checkbox" name="hobby" value="game">游戏<input type="checkbox" name="hobby" value="study">学习<br><input type="submit" value="注册"></form></body></html>

package com.example.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.BufferedReader;import java.io.IOException;import java.util.Enumeration;import java.util.Map;import java.util.Set;@WebServlet(name = "RequestDemo6", value = "/RequestDemo6")public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get 获取请求参数//根据参数名称获取参数值String username = request.getParameter("username");/*System.out.println("get");System.out.println(username);*///根据参数名称获取参数值的数组String[] hobbies = request.getParameterValues("hobby");/*for (String hobby:hobbies) {System.out.println(hobby);}*///根据所有请求的参数名称Enumeration<String> parameterNames = request.getParameterNames();/*while (parameterNames.hasMoreElements()){String name = parameterNames.nextElement();System.out.println(name);String value = request.getParameter(name);System.out.println(value);System.out.println("----------------------");}*///获取所有参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();//遍历Set<String> keySet = parameterMap.keySet();for (String name :keySet) {//根据键获取值String[] values = parameterMap.get(name);for (String value :values) {System.out.println(value);}System.out.println("-----------------------");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post 获取请求参数//根据参数名称获取参数值String username = request.getParameter("username");/*System.out.println("post");System.out.println(username);*///根据参数名称获取参数值的数组String[] hobbies = request.getParameterValues("hobby");for (String hobby:hobbies) {System.out.println(hobby);}//根据所有请求的参数名称Enumeration<String> parameterNames = request.getParameterNames();while (parameterNames.hasMoreElements()){String name = parameterNames.nextElement();System.out.println(name);String value = request.getParameter(name);System.out.println(value);System.out.println("----------------------");}//获取所有参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();//遍历Set<String> keySet = parameterMap.keySet();for (String name :keySet) {//根据键获取值String[] values = parameterMap.get(name);for (String value :values) {System.out.println(value);}System.out.println("-----------------------");}}}

中文乱码问题:

get 方式:tomcat 8 已经将 get 方式乱码问题解决了

post 方式:会乱码

解决:在获取参数前,设置 request 的编码request.setCharacterEncoding("utf-8");

请求转发:一种在服务器内部的资源跳转方式

步骤: 通过 request 对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)使用 RequestDispatcher 对象来进行转发:forward(ServletRequest request, ServletResponse response)特点: 浏览器地址栏路径不发生变化;只能转发到当前服务器内部资源中;转发是一次请求。

共享数据:

域对象:一个有作用范围的对象,可以在范围内共享数据。

request 域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。

方法:

void setAttribute(String name,Object obj):存储数据Object getAttitude(String name):通过键获取值void removeAttribute(String name):通过键移除键值对

package com.example.request;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;import java.util.Enumeration;import java.util.Map;import java.util.Set;@WebServlet(name = "RequestDemo8", value = "/RequestDemo8")public class RequestDemo8 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo88888被访问了......");//转发到demo9资源/*RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo9");requestDispatcher.forward(request, response);*///存储数据到request域中request.setAttribute("msg", "hello");request.getRequestDispatcher("/RequestDemo9").forward(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo88888被访问了......");//转发到demo9资源/*RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo9");requestDispatcher.forward(request, response);*///存储数据到request域中request.setAttribute("msg", "hello");request.getRequestDispatcher("/RequestDemo9").forward(request, response);}}

package com.example.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;import java.util.Enumeration;import java.util.Map;import java.util.Set;@WebServlet(name = "RequestDemo9", value = "/RequestDemo9")public class RequestDemo9 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取数据Object msg = request.getAttribute("msg");System.out.println(msg);System.out.println("demo99999被访问了......");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取数据Object msg = request.getAttribute("msg");System.out.println(msg);System.out.println("demo99999被访问了......");}}

获取 ServletContext:

ServletContext getServletContext()

package com.example.request;import javax.servlet.ServletContext;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 = "RequestDemo10", value = "/RequestDemo10")public class RequestDemo10 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = request.getServletContext();System.out.println(servletContext);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = request.getServletContext();System.out.println(servletContext);}}

4、用户登录

4.1、需求分析

编写 login.html 登录页面;

username & password 两个输入框

使用 Druid 数据库连接池技术,操作 mysql,day14 数据库中USER 表;

使用 JdbcTemplate 技术封装 JDBC;

登录成功跳转到 SuccessServlet 展示:登录成功!用户名,欢迎您;

登录失败跳转到 FailServlet 展示:登录失败,用户名或密码错误!

4.2、分析

4.3、开发步骤

4.3.1、创建项目,导入 html 页面,配置文件,jar 包

4.3.2、创建数据库环境

CREATE DATABASE day14;USE day14;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32) UNIQUE NOT NULL,PASSWORD VARCHAR(32) NOT NULL);

4.3.3、创建包 domain,创建类 User

package domain;/*** 用户实体类*/public class User {private int id;private String username;private String password;public int getId() {return id;}public String getUsername() {return username;}public String getPassword() {return password;}public void setId(int id) {this.id = id;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}

4.3.4、创建包 util,编写工具类 JDBCUtils

package util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;/*** JDBC工具类 使用Durid连接池*/public class JDBCUtils {private static DataSource ds;static {try {//1.加载配置文件Properties pro = new Properties();//使用ClassLoader加载配置文件,获取字节输入流InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.初始化连接池ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接池对象*/public static DataSource getDataSource(){return ds;}/*** 获取连接Connection对象*/public static Connection getConnection() throws SQLException {return ds.getConnection();}}

4.3.5、创建包 dao,创建类 UserDao,提供 login 方法

package dao;import domain.User;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import util.JDBCUtils;/*** 操作数据库中User表的类*/public class UserDao {//声明JDBCTemplate对象共用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 登录方法* @param loginUser 只有用户名和密码* @return user包含用户全部数据,没有查询到,返回null*/public User login(User loginUser){try {//1.编写sqlString sql = "select * from USER where username = ? and password = ?";//2.调用query方法User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(), loginUser.getPassword());return user;} catch (DataAccessException e) {e.printStackTrace();//记录日志return null;}}}

测试类 Test

package test;import dao.UserDao;import domain.User;import org.junit.Test;public class UserDaoTest {@Testpublic void testLogin(){User loginuser = new User();loginuser.setUsername("superbaby");loginuser.setPassword("123");UserDao dao = new UserDao();User user = dao.login(loginuser);System.out.println(user);}}

4.3.6、编写 web.servlet.LoginServlet 类

package web.servlet;import dao.UserDao;import domain.User;import mons.beanutils.BeanUtils;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.beans.beancontext.BeanContext;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.util.Map;@WebServlet(name = "LoginServlet", value = "/LoginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置编码request.setCharacterEncoding("utf-8");//2.获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");//3.封装USER对象User loginuser = new User();loginuser.setUsername("username");loginuser.setPassword("password");//4.调用UserDao的login方法UserDao userDao = new UserDao();User user = userDao.login(loginuser);//5.判断userif (user == null){//登录失败request.getRequestDispatcher("/failServlet").forward(request, response);}else {//登录成功//存储数据request.setAttribute("user", user);request.getRequestDispatcher("/successServlet").forward(request, response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}

4.3.7、编写 FailServlet 和 SuccessServlet 类

package web.servlet;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "FailServlet", value = "/FailServlet")public class FailServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给页面写一句话//设置编码response.setContentType("text/html; charset=utf-8");//输出response.getWriter().write("登录失败,用户名或密码错误");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}

package web.servlet;import domain.User;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 = "SuccessServlet", value = "/SuccessServlet")public class SuccessServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取request域中共享的user对象User user = (User) request.getAttribute("user");if (user != null) {//给页面写一句话//设置编码response.setContentType("text/html; charset=utf-8");//输出response.getWriter().write("登录成功!" + user.getUsername() + ",欢迎您。");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}

4.3.8、login.html 中 form 表单的 action 路径的写法

虚拟目录 + Servlet 的资源路径

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="/li/LoginServlet" method="post">用户名:<input type="text" name="username"> <br>密码:<input type="password" name="password"><br><input type="submit" value="登录"></form></body></html>

4.3.9、BeanUtils 工具类,简化数据封装

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。