HTTP协议以及登录案例(学习笔记)

8 篇文章 0 订阅
3 篇文章 0 订阅

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>&emsp;码:<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 {

        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值