HTTP:
- 概念:Hyper Text Transfer protocol 超文本传输协议
- 传输协议:定义了客户端和服务器端通信时,发送数据的格式
- 特点:
- ①基于TCP/IP的高级协议:是安全的,TCP三次握手和四次挥手
- ②默认端口号:80
- ③基于请求/相应模型的:一次请求对应一次相应
- ④无状态的:每次请求之间相互独立,不能交互数据
历史版本:
①1.0:每发送一次请求都会建立新的连接
② 1.1:复用连接,每次发送请求后会等一段时间,在这段时间内再次发送请求,就会复用刚才建立的连接,否则就会关闭连接
请求消息数据格式
1 请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求方式:
HTTP协议有7中请求方式,常用的有两种
①GET
*请求参数在请求行中,在url后
*请求的url长度有限
*不太安全,因为请求的参数能在url中被看到
②POST
*请求参数在请求体中
*请求的url长度没有限制
*相对安全
2 请求头
请求头名称:请求头值
常见的请求头:
①User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
浏览器告诉服务器,我访问你使用的浏览器信息
*可以在服务器端获取该头的信息,可以通过判断这个字符串中是否包含比如firefox,chrome等关键字来判断是那种类型的浏览器,以做不同处理,解决浏览器兼容问题
②Referer:http://google.ifanyi.com.cn/
告诉服务器,(当前请求)从哪里来
*作用:
1 防盗链接(判断请求来自某个指定首页,才允许执行下面的操作,否则不允许)
2 统计工作(判断来自不同链接的访问量)
3 请求空行
空行 用于分隔POST请求头和请求体,GET请求没有请求头
4 请求体(正文)
*封装POST请求消息的请求参数
浏览器和tomcat服务器交互流程:
①浏览器向tomcat服务器发送请求
②tomcat服务器会根据请求url中的资源路径,创建对应的ServletDemo对象
③tomcat服务器会创建request和response对象,request对象中封装请求消息数据
④tomcat将request和response两个对象传递给service方法,并且调用service方法
⑤开发通过request对象获取请求消息数据,通过response对象设置相应消息数据
⑥服务器在给浏览器做出响应之前会从response对象中取出响应消息数据返回给浏览器
request:
1 request对象和response对象的原理
①request和response对象是由服务器创建的,我们来使用
②request对象是用于获取请求消息,response对象是用于设置响应消息
2 request对象继承体系
ServletRequest (接口)
| 继承
HttpServletRequest (接口)
| (实现)
org.apache.catalina.connector.RequestFacade 类(Tomcat实现的)
3 request功能
1 获取请求消息数据
①获取请求行数据
* GET /servlet_demo/test?name=zhangsan HTTP/1.1
* 方法
* 1 获取请求方式 :GET
* String getMethod()
* 2 获取虚拟目录: /servlet_demo
* String getContextPath()
* 3 获取Servlet路径
* String getServletPath()
* 4 获取get方式请求参数:name=zhangsan
* String getQueryString()
* 5 获取请求URI:/servlet_demo/test
* String getRequestURI() : /servlet_demo/test
* String getRequestURL() : http:localhost/servlet_demo/test
* 6 获取协议及版本
* String getProtocol() : /servlet_demo/test
* 7 获取客户机的ip地址
* String getRemoteAddr() : /servlet_demo/test
package servlet;
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("/demo3")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is a get request");
System.out.println("method: "+req.getMethod());
System.out.println("虚拟目录 : "+req.getContextPath());
System.out.println("servlet目录 : "+req.getServletPath());
System.out.println("获取uri : "+req.getRequestURI());
System.out.println("获取url : "+req.getRequestURL());
System.out.println("获取get请求参数: "+req.getQueryString());
System.out.println("获取协议及版本: "+req.getProtocol());
System.out.println("获取客户机ip : "+req.getRemoteAddr());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is a post request");
}
}
==>访问路径 http://localhost:8080/demo3?name=zhangsan&sex=mail
this is a get request
method: GET
虚拟目录 :
servlet目录 : /demo3
获取uri : /demo3
获取url : http://localhost:8080/demo3
获取get请求参数: name=zhangsan&sex=mail
获取协议及版本: HTTP/1.1
获取客户机ip : 127.0.0.1
②获取请求头数据
*方法
*String getHeader(String name) : 通过请求头名称获取请求头的值
*Enumeration getHeaderNames():获取所有的请求头名称,类似迭代器,这种方式用的比较少,通常都是使用上面的一种方式,根据具体的请求头名称获取请求头的值
package servlet;
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("/demo4")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//返回Enumeration对象,类似迭代器
Enumeration<String> headerNames = req.getHeaderNames();
//使用while循环,判断有下一个元素,只要还有元素就进行打印
while(headerNames.hasMoreElements()){
String ele = headerNames.nextElement();
String value = req.getHeader(ele);
System.out.println("请求头数据: " + ele + " --- "+value );
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is a post request");
}
}
可以通过请求头的user-agent判断浏览器类型,以解决兼容性问题
package servlet;
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("/demo5")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//getHeader方法内传入的字符串不区分大小写
String agent_info = req.getHeader("user-agent");
System.out.println("agent_info: "+agent_info);
if(agent_info.toLowerCase().contains("chrome")){
System.out.println("当前为谷歌浏览器");
}else if(agent_info.toLowerCase().contains("firefox")){
System.out.println("当前为火狐浏览器");
}else{
System.out.println("当前为其他浏览器");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is a post request");
}
}
==>当前谷歌浏览器访问http://localhost:8080/demo5
输出:
agent_info: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
当前为谷歌浏览器
获取请求头中的regerer信息,可用于防止盗链
//该tomcat项目的虚拟路径为/test
package servlet;
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("/demo6")
public class ServletDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String referer = req.getHeader("referer");
System.out.println("referer: "+referer);
if(referer!=null){
if(referer.contains("/test")){
//向页面输出中文时需要设置下面这句话
resp.setContentType("text/html;charset=utf-8");
//向页面输出一句话
resp.getWriter().write("看高清电影");
}else{
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("请从正规渠道看电影");
}
}else{
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("参数是空的");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is a post request");
}
}
-- 另外一个tomcat项目的html login.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>表单</title>
</head>
<body>
< <form action="/demo3" method="post">
<input name="user_name" value="aaa">
<input type="submit" value="提交">
</form>
<!-->跳转链接,这样跳转得到的referer中包含/test,因此可以正常看到电影<-->
<a href="http://localhost:8080/test/demo6">跳转练级</a>>
</body>
</html>
<!-->第三个tomcat项目<-->
-- 另外一个tomcat项目的html login.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>表单</title>
</head>
<body>
< <form action="/demo3" method="post">
<input name="user_name" value="aaa">
<input type="submit" value="提交">
</form>
<!-->跳转链接,这样跳转得到的referer中不包含/test,因此会被拦截,不能正常看到电影<-->
<a href="http://localhost:8080/demo6">跳转练级</a>>
</body>
</html>
③ 获取请求体数据
*请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
*步骤:
1 获取流对象
*BufferedReader getReader():获取字符输入流,只能操作字符数据
*ServletInputStream getInputStream() : 获取字节输入流,可以操作所有类型数据
2 再从流对象中获取数据
<!-->文件名register.html<-->
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>表单</title>
</head>
<body>
<form action="/test/requestDemo5" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="submit" value="注册">
</form>>
</body>
</html>
// java代码
package servlet;
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;
@WebServlet("/requestDemo5")
public class ServletDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is get request");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request获取字符流数据
BufferedReader br = req.getReader();
String line=null;
//判断取到的行的数据是否为空,不为空则循环输出
while((line=br.readLine()) != null){
System.out.println(line);
}
}
}
启动tomcat服务器,访问http:localhost:8080/test/register.html,输入用户名密码后,点击注册按钮提交表单
再idea控制台就能看到打印了传入的参数信息
username=lisi&password=wangwu
2 其他功能
①获取请求参数通用方式 不论是get或post请求,都能使用
Ⅰ String getParametr(String name):根据参数名称获取参数值 username=zhangsan&password=12345
Ⅱ String[] getParameterValues(String name) : 根据参数名称获取参数值的数组 hobby=xx1&hobby=xx2
Ⅲ Enumeration getParameterNames() : 获取所有参数的名称列表
Ⅳ Map<String,String[]> getParameterMap() : 获取封装了所有参数名称和值的map集合
// 通过getParametr(String name) 方法获取参数的值 只能获取一个值
//启动tomcat服务器访问registr.html,填写表单提交后可在idea中看到获取到参数
package servlet;
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;
@WebServlet("/requestDemo6")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
System.out.println("this is a get request");
System.out.println(user_name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
System.out.println("this is a post request");
System.out.println(user_name);
}
}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>表单</title>
</head>
<body>
<form action="/test/requestDemo6" method="post"><!-->这里也可以修改成get<-->
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="password" placeholder="请输入密码" name="password"><br>
<input type="submit" value="注册">
</form>>
</body>
</html>
package servlet;
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;
@WebServlet("/requestDemo6")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
System.out.println("this is a get request");
System.out.println(user_name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username: "+user_name);
System.out.println("password: "+password);
//通过getParameterValues方法获取复选框的数据
String[] hobby = req.getParameterValues("hobby");
System.out.println("hobby");
for(String hob:hobby){
System.out.println(hob);
}
}
}
关于获取get和post请求参数值中文乱码问题
// tomcat8以前 get和post都会乱码,tomcat8中get乱码问题得到解决,但是post参数依然乱码,解决方式
package servlet;
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;
@WebServlet("/requestDemo6")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
System.out.println("this is a get request");
System.out.println(user_name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在获取参数前设置request的字符集
req.setCharacterEncoding("utf-8");
String user_name = req.getParameter("username");
System.out.println(user_name);
}
}
②请求转发:一种在服务器内部的资源跳转方式
1 步骤
①通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
②使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
2 特点
①浏览器地址栏路径不发生变化
②只能转发到当前服务器内部资源中(不能访问比如百度等资源)
③转发是一次请求,F12可以看到只有一次请求
register.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>表单</title>
</head>
<body>
<form action="/test/requestDemo8" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="password" placeholder="请输入密码" name="password"><br>
<input type="checkbox" name="hobby" value="swimming">游泳
<input type="checkbox" name="hobby" value="running">跑步
<input type="checkbox" name="hobby" value="jumping">跳跃<br>
<input type="submit" value="注册">
</form>>
</body>
</html>
package servlet;
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("/requestDemo8")
public class ServletDemo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("8888888888被访问了");
req.getRequestDispatcher("/requestDemo9").forward(req,resp);
}
}
package servlet;
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("/requestDemo9")
public class ServletDemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("9999999999被访问了");
}
}
启动tomcat服务器,访问 http:localhost:8080/test/register.html ,填写表单提交后,在idea控制台看到
8888888888被访问了
9999999999被访问了
//访问/requestDemo8,将资源转发到可/requestDemo9
③共享数据
*域对象:一个有作用范围的对象,可以在范围内共享数据
*request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
*方法
1 void setAttribute(String name,Object obj) : 存储数据 在转发前
2 Object getAttribute(String name) : 通过键获取值
3 void removeAtribute(String name) : 通过键移除键值对
//ServletDemo8
package servlet;
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("/requestDemo8")
public class ServletDemo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("8888888888被访问了");
//转发前存储数据
req.setAttribute("name","zhangsan");
req.getRequestDispatcher("/requestDemo9").forward(req,resp);
}
}
//ServletDemo9
package servlet;
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("/requestDemo9")
public class ServletDemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("9999999999被访问了");
//获取共享数据
System.out.println("共享数据的name值: "+req.getAttribute("name"));
}
}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>表单</title>
</head>
<body>
<form action="/test/requestDemo8" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="password" placeholder="请输入密码" name="password"><br>
<input type="checkbox" name="hobby" value="swimming">游泳
<input type="checkbox" name="hobby" value="running">跑步
<input type="checkbox" name="hobby" value="jumping">跳跃<br>
<input type="submit" value="注册">
</form>>
</body>
</html>
启动tomcat服务器,访问 http://localhost:8080/test/register.html,提交表单,在idea中看到,在ServletDemo9中访问到了ServletDemo8共享的数据
8888888888被访问了
9999999999被访问了
共享数据的name值: zhangsan
④获取ServletContext对象
package servlet;
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("/requestDemo9")
public class ServletDemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servlet = req.getServletContext();
System.out.println(servlet);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is a post request");
}
}
案例:用户登录
*用户登录案例需求
1 编写login.html登录界面 username,password两个输入框
2 使用Druid数据库连接池技术,操作mysql,test数据库中user表
3 写一个JDBCUtils工具类获取数据库连接
4 输入用户名密码,如果点击登录,
①判断数据库中是否有该用户,没有的话提示注册
②有该用户但密码不匹配提示:登录失败,用户名或密码错误
③用户名和密码都成功匹配则提示:登录成功!用户名,欢迎您
5 登录成功跳转到SuccessServlet
6 登录失败跳转到FailServlet展示
7 点击注册按钮触发RegisterServlet,将用户输入的用户名和密码提交到数据库
开发步骤:
①创建项目login_case,在web目录下创建login.html文件,druid.properties数据库连接池配置文件,在web目录下创建WEB-INF目录,在该目录下创建lib目录放jar包(包括数据库驱动,连接池jar包等)
login.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>页面登录</title>
</head>
<body>
<form action="" name="form1" method="post">
用户名:<input type="text" name="username" ><br>
密 码:<input type="password" name="password" ><br>
<!-- 点击登录时触发一个action,点击注册时触发一个action -->
<input type="submit" onclick="form1.action='/test/loginServlet';form1.submit();" value="登录">
<input type="submit" onclick="form1.action='/test/registerServlet';form1.submit();" value="注册">
</form>
</body>
</html>
druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test
username=root
password=12345678
initialsize=5
maxActive=10
maxWait=3000
②创建数据库环境
create database test;
use test;
create table user(
username varchar(32) primary key,
password varchar(32) not null
)
default character set=utf8;
insert into user values('zhangsan','123456');
③idea中创建包cn.itcast.domain,创建类User
package cn.itcast.domain;
//user表实体类(javaBean)
public class User {
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
④创建包cn.itcast.dao,创建类UserDao,提供login方法
package cn.itcast.dao;
import cn.itcast.domain.User;
import cn.itcast.util.JDBCUtils;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
/**
* 登录方法
* @param loginUser 只有用户名和密码
* @return user包含用户全部数据
*/
public User login(User loginUser) throws SQLException {
DataSource ds = JDBCUtils.getDataSource();
Connection conn = ds.getConnection();
String sql="select username,password from user where username=? ";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,loginUser.getUsername());
// ps.setString(2,loginUser.getPassword());
ResultSet rs = ps.executeQuery();
if(!rs.next()){
return null;
}else {
String username = rs.getString("username");
String password = rs.getString("password");
System.out.println("username: " + username);
System.out.println("password: " + password);
User user = new User();
user.setUsername(username);
user.setPassword(password);
return user;
}
}
}
⑤创建LoginServlet类,内部调用UserDao的login方法
package cn.itcast.web.servlet;
import cn.itcast.dao.UserDao;
import cn.itcast.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;
import java.sql.SQLException;
@WebServlet("/loginServlet")
public class LoginServlet 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 {
//设置编码
req.setCharacterEncoding("utf-8");
//存储request域变量
//获取用户名和密码
String username = req.getParameter("username");
String pwd = req.getParameter("password");
System.out.println("login username: "+username + " " + "login password :" + pwd);
//创建user对象
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setPassword(pwd);
//调用UserDao的login方法
UserDao dao=new UserDao();
try {
User user = dao.login(loginUser);
System.out.println("用户名: "+username + " "+user.getUsername());
System.out.println("密码: "+pwd + " "+user.getPassword());
//转发
if(user == null ){
req.setAttribute("loginStatus","nouser");
//如果没查到用户,说明用户没有注册 就转发到FailServlet
req.getRequestDispatcher("/failServlet").forward(req,resp);
}else if(!user.getPassword().equals(pwd)){
req.setAttribute("loginStatus","wrongPwd");
//如果没查到用户,说明用户没有注册 就转发到FailServlet
req.getRequestDispatcher("/failServlet").forward(req,resp);
}else{
//如果成功查到用户就转发到SuccessServlet
//存储变量
req.setAttribute("user",user);
req.getRequestDispatcher("/successServlet").forward(req,resp);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
⑥创建FailServlet类
package cn.itcast.web.servlet;
import cn.itcast.domain.User;
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("/failServlet")
public class FailServlet 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 {
//设置编码
resp.setContentType("text/html;charset=utf-8");
//获取存储变量
Object ls = req.getAttribute("loginStatus");
//判断用户不存在就提示未注册,进行注册
if("nouser".equals(ls.toString())){
//向页面输出一句话
resp.getWriter().write("您还没有注册,请先注册,再登录");
//走到这里说明用户存在但是密码输入错误
}else if("wrongPwd".equals(ls.toString())) {
resp.getWriter().write("您的密码有误,请输入正确的密码");
}else{
resp.getWriter().write("意外的登录异常");
}
}
}
⑦创建SuccessServlet类
package cn.itcast.web.servlet;
import cn.itcast.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("/successServlet")
public class SuccessServlet 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 {
//获取request域变量
User user = (User)req.getAttribute("user");
//设置编码
resp.setContentType("text/html;charset=utf-8");
//向页面输出一句话
resp.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");
}
}
⑧创建RegisterServlet类
package cn.itcast.web.servlet;
import cn.itcast.util.JDBCUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@WebServlet("/registerServlet")
public class RegisterServlet 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 {
req.setCharacterEncoding("utf-8");
//获取用户输入的用户名和密码
String username = req.getParameter("username");
String pwd = req.getParameter("password");
//通过JDBC工具类获取连接
try {
Connection conn = JDBCUtils.getConnection();
String sql="insert into user values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,pwd);
ps.executeUpdate();
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("注册成功!请重新登录");
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
}
}
}