1. http 协议
1.1 基本概念
1.1.1 http 协议的简介
- 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW 文件都必须遵守这个标准。
1.1.2 http 协议的作用
- 互联网的数据传输底层依赖tcp 协议,http 协议架构在tcp 协议之上,它规范了浏览器和服务器之间通讯(传输数据)的内容和格式。
1.1.3 HTTP 协议的应用场景
刷屏软件、智能家居
1.2 http 协议数据查看方式
1.2.1 浏览器查看浏览器与服务器通讯过程
1.2.1.1 谷歌->f12
1.2.1.2 火狐->f12
1.3 请求信息的组成部分
- http 请求一共分为三个部分:请求行,请求头,请求体。
1.3.1 Http 请求数据的组成
1.3.2 请求行
1.3.2.1 格式
-
格式1:
get+url?请求参数数据+http协议版本
其中:
url:访问路径
请求参数数据:浏览器提交的数据,如用户名、密码等,用?隔开
-
格式2:
post+url+http协议版本
1.3.2.2 get和post请求方式的区别:
get | post | |
---|---|---|
数据长度是否有限制 | 是 | 否 |
是否包含请求体 | 否 | 是 |
数据是否暴露地址栏 | 是 | 否 |
请求参数出现位置 | 请求行 | 请求体 |
1.3.2.3 http协议的版本
http1.0:浏览器与服务器建立一次连接只能获取一个资源;
http1.1:浏览器与服务器建立一次连接可以获取多个资源;
笔试题
Q:对于以下的网页,请求该页面的时候浏览器会向服务器发出多少次请求?
A:总共3次,第一次是对整个网页结构发出请求,后两次分别对页面的图片资源发出请求。
1.3.4 请求头
- 格式:
key:value
(通过键值对保存信息)
里面内容很多,其中有两个需要注意:
Referer: 上一次请求的地址
User-Agent: 当前用户的系统和浏览器版本。
1.3.5 请求体
- 格式:存储以post提交的请求数据
- get 请求没有请求体,只有post 请求才有请求体
2. request对象获取请求信息
2.1 基本概念
- HttpServletRequest对象代表客户端的请求,当客户端通过HTTP 协议访问服务器时,HTTP 请求中的所有请求信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
2.2 request 获取请求行信息
2.2.1 请求行的组成元素(通过request 获取请求行数据)
- 请求方式、请求路径、协议版本
2.2.2 常用API
- String getMethod(); 获取请求方式的类型
- String getRequestURI(); 获取请求行中的资源名部分
- StringBuffer getRequestURL();
获取客户端发出请求完整URL,返回的是一个StringBuffer,如果要获得字符串还要再使用tostring方法
注:
uri: 统一资源标识符,用来标识一个资源,资源路径。
url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资源.
示例:
- String getProtocol(); 获取当前协议的名称和版本
- String getRemoteAddr(); 获取IP地址
- int getLocalPort(); 获取端口
获取IP地址可以了解到访问该网站的用户IP的地区,从而根据访问量分析用户群
localhost默认使用ipv6本机地址——0:0:0:0:0:0:0:1,而127.0.0.1是ipv4的本机地址
2.2.3 示例代码
@WebServlet(urlPatterns = "/note01")
public class Notes01Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求方式的类型
String method = request.getMethod();
//获取请求行中的资源名部分
String uri = request.getRequestURI();
//获取客户端发出请求完整URL
String url = request.getRequestURL().toString();
//获取当前协议的名称和版本
String protocol = request.getProtocol();
//获取IP地址
String id = request.getRemoteAddr();
//获取端口
int port = request.getLocalPort();
//在输出台中输出信息
System.out.println("请求方式:" + method);
System.out.println("请求资源uri:" + uri);
System.out.println("请求资源url:" + url);
System.out.println("协议版本:" + protocol);
System.out.println("ip地址:" + id);
System.out.println("端口号:" + port);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
效果图:
2.3 request 获取请求头信息
2.3.1 获取请求头信息常用的方法
- String getHeader(String name);
以String 的形式返回指定请求头的值
- Enumeration getHeaderNames();
返回此请求包含的所有头名称(key)的枚举
2.3.1.1 示例代码
步骤:1、Enumeration getHeaderNames()
获得迭代器
2、获取每个元素
@WebServlet(urlPatterns = "/note02")
public class Notes02Servlet extends HttpServlet {
/*
Enumeration迭代器进行迭代时,使用到hasMoreElements()【相当于hasNext()】,以及nextElement()【相当于Next()】
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得所有请求头的key
Enumeration<String> keys = request.getHeaderNames();
//遍历key集合
while (keys.hasMoreElements()) {
//取出每个元素
String key = keys.nextElement();
//根据请求头名称获得值
String value = request.getHeader(key);
//输出效果
System.out.println(key + ":" + value);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.3.2 请求头referer(重要)
2.3.2.1 referer作用
- 利用referer 获取当前请求的上一个请求资源(从哪个网页跳转到本网页)。
- 如果没有上一个请求资源,则referer的值为null
示例代码
@WebServlet(urlPatterns = "/referer")
public class Notes03Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取referer
String referer = request.getHeader("referer");
System.out.println("referer:" + referer);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.3.2.2 referer应用——防盗链
一般网页在分享资源的同时通过广告进行营利。如果自身的资源可以被任意的链接获取,那么资源就容易被非法盗取,影响自身营利,甚至有给用户不好的体验,影响访问量。故需要进行防盗链设置。
防盗链的原理是:判断当前请求的上一个资源是否来自于本身的网站资源,如果是就允许访问获取,否则不允许。
案例代码
下载列表页面,不直接连接到资源
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载列表</title>
<style type="text/css"></style>
<script type="text/javascript"></script>
</head>
<body>
<a href="/day28/ad.html">哈利波特</a> <!--记得补充工程名,保证访问的是day28工程的ad网页-->
<a href="/day28/ad.html">指环王</a>
<a href="/day28/ad.html">霍比特人</a>
</body>
</html>
广告页面,里面链接到资源的Servlet
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>广告</title>
<style type="text/css"></style>
<script type="text/javascript"></script>
</head>
<body>
<h2>这里是广告页面~</h2>
<a href="/day28/download">哈利波特</a> <!--此处链接真正的资源Servlet-->
<a href="/day28/download">指环王</a>
<a href="/day28/download">霍比特人</a>
</body>
</html>
资源Servlet,连接服务器
@WebServlet(urlPatterns = "/download")
public class Notes04Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这里先用文字模拟下载的效果
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取当前用户来自于哪个网页
String referer = request.getHeader("referer");
//如果是来自于自己网页,则允许下载
//原则上如果用户直接输入下载地址(referer为null),应该给予下载
if (referer==null || referer.contains("ad.html")) {
out.write("资源下载中");
} else {
//不是自己页面的不允许下载,并提示用户访问自己的网页
out.write("您访问的网址已失效,请访问最新网址:http://xxxxx....");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.3.3 请求头user-agent
2.3.3.1 user-agent作用
- 利用user-agent 获取客户端使用的是什么浏览器版本与浏览器内核。
示例代码
2.3.3.2 user-agent应用
- 根据访问的浏览器版本/内核返回不同的页面,比如手机端和pc端的访问页面不一样。
2.4 request 获取请求参数数据(重要)
2.4.1 获取请求参数方法
- String getParameter(String name);
根据表单的name属性获取对应的值(获得单个值)
- String[] getParameterValues(String name);
获取name相同的所有value, 例如复选框。
- Map<String, String[]> getParameterMap();
参数名(参数的name属性值)作为key,参数值(用户提交的请求参数)作为value,封装到map中。
2.4.2 解决乱码问题
- get方式提交中文数据没有乱码问题,post方式提交中文数据会有乱码问题。
2.4.2.1 乱码产生的原因
-
post方式提交的数据出现在请求体中,而tomcat服务器中request对象读取请求体数据时默认使用iso8859-1码表,码表不一致导致乱码现象;
-
而get方式提交的数据出现在请求头中,不会涉及到request读取请求体的解码过程。
2.4.2.2 乱码解决方式
- void setCharacterEncoding(String env);
设置request 读取请求体的解码码表
其中:env是码表
注意:修改request读取post解码码表要在读取数据之前
示例代码
准备工作:创建一个登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<style type="text/css"></style>
<script type="text/javascript"></script>
</head>
<body>
<h2>get方式注册</h2>
<form action="/day28/regist" method="get">
用户名:<input type="text" name="userName"/><br/>
爱好:<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="basketball"/>蓝球
<input type="checkbox" name="hobby" value="swimming"/>游泳<br/>
<input type="submit" value="get提交">
</form>
<form action="/day28/regist" method="post">
用户名:<input type="text" name="userName"/><br/>
爱好:<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="basketball"/>蓝球
<input type="checkbox" name="hobby" value="swimming"/>游泳<br/>
<input type="submit" value="post提交">
</form>
</body>
</html>
服务器Servlet代码:
@WebServlet(urlPatterns = "/regist")
public class Notes05Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求体用户名
String userName = request.getParameter("userName");
//获得请求体爱好
String[] hobbies = request.getParameterValues("hobby");
//输出
System.out.println("使用get方法提交,用户名:" + userName + ",爱好是:" + Arrays.toString(hobbies));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*解决post提交数据时中文乱码问题*/
request.setCharacterEncoding("utf-8"); //设置request获取请求体内容的时候使用的码表
//获取请求体用户名
String userName = request.getParameter("userName");
//获得请求体爱好
String[] hobbies = request.getParameterValues("hobby");
//输出
System.out.println("使用post方法提交,用户名:" + userName + ",爱好是:" + Arrays.toString(hobbies));
}
}
2.4.3 使用BeanUtils封装表单提交的数据javaBean对象中(重要)
2.4.3.1 BeanUtils的概述
- BeanUtils是Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。
2.4.3.2 BeanUtils的条件
-
BeanUtils类必须使用public修饰。
-
提供无参数的构造器。
-
提供getter和setter方法访问属性。
2.4.3.3 使用BeanUtils的注意事项(重要)
- 如果在web工程中导入jar包,那么jar包必须放置在web/WEB-INF目录下的lib目录下,否则tomcat将不会识别这些jar包!!
- 实体类的每个属性名要与request参数的name属性值一致!!(区分大小写)。表单name属性值、实体类对应属性名、数据库对应属性名三者保持完全一致
2.4.3.4 BeanUtils的优势
- 实现参数自动封装到实体类上。(参数有值就封装,参数无值就不封装)
- 提交的参数都是String类型,但BeanUtils会自动类型转换(仅限于转换八种基本数据类型)
2.4.3.5 涉及方法
-
request对象获取参数的方法:
Map getParameterMap()
-
BeanUtils自身方法
- BeanUtils.populate(bean,param); 参数: bean 当前需要封装的参数的实体对象 param : 当前存储参数的map
2.4.3.6 示例案例
需求:实现登录功能
准备工作:创建实体类和登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="/day28/loginServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td>年龄</td>
<td><input type="text" name="age"/></td>
</tr>
<tr>
<td>性别</td>
<td><input type="text" name="gender"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
public class User {
private String userName;
private String password;
private int age;
private String gender;
public User() {
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
服务器登录Servlet
@WebServlet(urlPatterns = "/loginServlet")
public class Notes06Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//由于这里的doPost方法调用了doGet方法,所以这里也要解决post方式出现的乱码问题
request.setCharacterEncoding("utf-8");
//获取所有请求参数,封装到map中
Map<String, String[]> param = request.getParameterMap();
//创建实体类对象
User user = new User();
//使用BeanUtils封装到实体类
try {
BeanUtils.populate(user, param);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("用户信息为:" + user);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.4.4 request获取工程名字
- String getContextPath(); 获取工程名字
示例代码
@WebServlet(urlPatterns = "/contextPath")
public class Notes07Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得工程名称
String path = request.getContextPath();
System.out.println("工程名称:" + path);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.4.5 请求转发页面跳转(重要)
- 页面跳转(资源跳转),从一个资源跳转到本服务器内的另一个资源
2.4.5.1 使用方法
- RequestDispatcher getRequestDispatcher(String path);
获取请求转发器(request对象方法)
- void forward(ServletRequest request, ServletResponse response);
将请求转发到另一个资源(servlet)上(RequestDispatcher对象的方法)
注意事项:
- 跳转的可以是另一个Servlet,也可以是一个网页,只要在path中填写对应的路径即可
2.4.5.2 使用步骤
-
先通过请求对象获取转发器;
-
再调用转发器转发方法,转发请求。
2.4.5.3 示例代码
oneServlet
@WebServlet(urlPatterns = "/oneServlet")
public class Notes08oneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入了oneServlet");
//请求转发页面跳转到twoServlet
request.getRequestDispatcher("/twoServlet").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
twoServlet
@WebServlet(urlPatterns = "/twoServlet")
public class Notes08twoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write("你已经进入twoServlet");
System.out.println("进入了twoServlet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.4.6 域对象
-
域对象: 存储数据的一种容器, 域对象不单止可以存储数据,更加重要的作用是在于Servlet与Servlet之间的数据传输。
-
request是一个请求域对象,就是每次请求的域对象是相互独立的,不同的请求不能共享.
request在Servlet与Servlet之间的数据传输时除了传输原来的参数,还能夹带些“私货”(额外的数据)
2.4.6.1 常用方法(凡是域对象都有)
- void setAttribute(String name, Object o);
设置数据到request域
- Object getAttribute(String name);
从request域获取数据
- void removeAttribute(String name);
从request域移除数据
注意:上述方法不会影响到request封装的请求参数数据,只会影响request域中的数据
示例代码
@WebServlet(urlPatterns = "/oneServlet")
public class Notes08oneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入了oneServlet");
//往request域中添加数据
request.setAttribute("loginUser","admin" );
//请求转发页面跳转到twoServlet
request.getRequestDispatcher("/twoServlet").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
@WebServlet(urlPatterns = "/twoServlet")
public class Notes08twoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.write("你已经进入twoServlet");
System.out.println("进入了twoServlet");
//从域中获取数据
Object loginUser = request.getAttribute("loginUser");
out.write("取出的数据是:" + loginUser);
//此时还能再跳转到登录页面
//request.getRequestDispatcher("login.html").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.4.7 请求转发页面跳转出现页面中文乱码的解决方式
步骤:
- 在conf/server.xml中的<标签内最末尾加上
URIEncoding="UTF-8"
或useBodyEncodingForURI="true"
,因为不知道哪个起效了,可以两个都放进去; - 编写Servlet时在最开头写上
response.setCharacterEncoding("utf-8");
,也可以把request的写上
3. 登录综合案例
-
准备开发环境
- 导入jar包
- 需要JDBCTemplate、druid、mysql驱动包、BeanUtils
-
导入Utils工具包
//JDBC的工具类 public class JDBCUtils { private static DataSource dataSource; static{ try { Properties properties = new Properties(); properties.load(JdbcUtils.class.getResourceAsStream("/druid.properties")); dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } //对外提供连接池 public static DataSource getDataSource(){ return dataSource; } //获取连接 public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } //关闭资源 public static void close(Connection con, Statement st , ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(st!=null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
-
分包管理项目
com.azure.web 存放servlet
com.azure.service 存放业务逻辑层
com.azure.dao 存放数据持久层,操作数据库的代码
com.azure.model 实体类
-
准备登录页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <form action="/day28/loginServlet" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="userName"/></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"/></td> </tr> <tr> <td>年龄</td> <td><input type="text" name="age"/></td> </tr> <tr> <td>性别</td> <td><input type="text" name="gender"/></td> </tr> <tr> <td></td> <td><input type="submit" value="登录"/></td> </tr> </table> </form> </body> </html>
-
实体类
package com.azure.model; public class User { private String userName; private String password; private int age; private String gender; public User() {} 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 int getAge() { return age;} public void setAge(int age) {this.age = age;} public String getGender() {return gender;} public void setGender(String gender) {this.gender = gender;} @Override public String toString() { return "Person{" + "userName='" + userName + '\'' + ", password='" + password + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
-
web层有两个Servlet
登录Servlet:
/* 思路:使用request获取用户输入的信息,封装成实体类对象,并访问数据库对比,如果存在该用户则输出登入成功,如果不存在转到failureServlet上 */ @WebServlet(urlPatterns = "/userLoginServlet") public class UserLoginServlet extends HttpServlet { private UserService userService = new UserService(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决响应中文乱码问题 response.setContentType("text/html;charset=utf-8"); //获得字符输出流 PrintWriter out = response.getWriter(); //获得用户信息 Map<String, String[]> map = request.getParameterMap(); //创建实体类对象 User user = new User(); //封装到实体类中 try { BeanUtils.populate(user, map); //调用service登录功能 if (userService.login(user)){ //登录成功输出语句 out.write("登录成功,欢迎" + user.getUserName()); } else { //登录失败转到failureServlet中 //因为在跳转的时候要把用户名带到failureServlet中,需要用到域对象 request.setAttribute("userName",user.getUserName()); //请求转发页面跳转 request.getRequestDispatcher("/failureServlet").forward(request,response ); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //*如果post方式的执行内容与get不同,则删掉下面代码重写即可 doGet(request, response); } }
失败Servlet
@WebServlet(urlPatterns = "/failureServlet") public class UserFailureServlet extends HttpServlet { /* 思路:跳转到这里后,输出登录失败语句 */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决响应乱码问题 response.setContentType("text/html;chatset=utf-8"); PrintWriter out = response.getWriter(); //获得域对象的数据 String userName = (String) request.getAttribute("userName"); out.write(userName + ":用户名不存在或者密码错误!"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //*如果post方式的执行内容与get不同,则删掉下面代码重写即可 doGet(request, response); } }
-
service层
public class UserService { private UserDao userDao = new UserDao(); public boolean login(User user) { //访问数据库,根据用户名和密码寻找用户,如果找到则返回true,找不到返回false User resultUser = userDao.findByUser(user); return resultUser != null; } }
-
dao层
public class UserDao { /* 思路:数据库操作内容,获得连接,使用JDBCTemplate查询数据库,如果找到user则返回,如果报错返回null */ private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); public User findByUser(User user) { String sql = "select * from user where name = ? and password = ?;"; try { return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), user.getUserName(), user.getPassword()); } catch (DataAccessException e) { return null; } } }