Tomcat的request

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

1536330565790

1.2.1.2 火狐->f12

1536330630415

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:对于以下的网页,请求该页面的时候浏览器会向服务器发出多少次请求?

1536391164292

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);
    }
}

效果图:

1536394373125

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的条件
  1. BeanUtils类必须使用public修饰。

  2. 提供无参数的构造器。

  3. 提供getter和setter方法访问属性。

2.4.3.3 使用BeanUtils的注意事项(重要)
  • 如果在web工程中导入jar包,那么jar包必须放置在web/WEB-INF目录下的lib目录下,否则tomcat将不会识别这些jar包!!
  • 实体类的每个属性名要与request参数的name属性值一致!!(区分大小写)。表单name属性值、实体类对应属性名、数据库对应属性名三者保持完全一致
2.4.3.4 BeanUtils的优势
  1. 实现参数自动封装到实体类上。(参数有值就封装,参数无值就不封装)
  2. 提交的参数都是String类型,但BeanUtils会自动类型转换(仅限于转换八种基本数据类型)
2.4.3.5 涉及方法
  1. request对象获取参数的方法:Map getParameterMap()

  2. 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 使用步骤
  1. 先通过请求对象获取转发器;

  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 请求转发页面跳转出现页面中文乱码的解决方式

步骤:

  1. 在conf/server.xml中的<标签内最末尾加上URIEncoding="UTF-8"useBodyEncodingForURI="true",因为不知道哪个起效了,可以两个都放进去;
  2. 编写Servlet时在最开头写上 response.setCharacterEncoding("utf-8");,也可以把request的写上

3. 登录综合案例

  1. 准备开发环境

    • 导入jar包
    • 需要JDBCTemplate、druid、mysql驱动包、BeanUtils
  2. 导入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();
                }
            }
        }
    }
    
  3. 分包管理项目

    com.azure.web 存放servlet

    com.azure.service 存放业务逻辑层

    com.azure.dao 存放数据持久层,操作数据库的代码

    com.azure.model 实体类

  4. 准备登录页面

    <!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>
    
  5. 实体类

    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 + '\'' +
                    '}';
        }
    }
    
  6. 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);
        }
    }
    
  7. service层

    public class UserService {
        private UserDao userDao = new UserDao();
    
        public boolean login(User user) {
            //访问数据库,根据用户名和密码寻找用户,如果找到则返回true,找不到返回false
            User resultUser = userDao.findByUser(user);
            return resultUser != null;
        }
    }
    
  8. 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;
            }
        }
    }
    

猜你喜欢

转载自blog.csdn.net/KeepStruggling/article/details/82767883
今日推荐