我们在前文Response的基础上,找到里面的HttpServletRequest类别,按住ctrl键,进入源码界面,如下所示:
我们发现Response里面为set,Request为get的一些方法。
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。
我们了解到getContextPath为获得上下文的路径。
getAuthType为获得作者信息,就是谁访问的
getHeaders为获得头信息
getHttpServletMapping为获得请求路径。
getMethod为获得请求的方法
getPathTranslated为获得最后一次登录。
getRemoteUser获取远程的用户。
getRequestURL获取请求的路径
getServletPath获取Servlet的路径
这些方法与Response完全对应。
获取参数的四个方法: :
getParameter() //获取指定前端传回来的名字,并且返回一个字符串,得到一个前端的类型
getParameterMap() //通常不使用这个
getParameterNames() //返回一个枚举,通常不用这个
getParameterValues() //返回一个数组,返回多个参数
我们进行创建一个新的模块,命名为Request。
创建完成之后,我们进行创建java,resources,进行该模块的完善。之后我们将web.xml利用之前的Note.md里面直接复制过来:
- "1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
- http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
- version="3.1"
- metadata-complete="true">
- web-app>
完成之后,我们删除掉index.jsp,重新创建一个新的index.jsp。如果在这个过程中我们没有创建index.jsp。
当我们出现以上问题的时候,我们可以将pom.xml里面的仓库给复制过来到Request里面的类,然后进行刷新即可:
-
javax.servlet.jsp -
javax.servlet.jsp-api -
2.3.3 -
provided -
之后我们创建index.jsp如下所示:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
登录 -
之后我们即可进行编写登录界面:
我们首先进行index.jsp的页面的编辑:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
登录 登录
- "text-align: center">
- <%--这里表单表示的意思:以post的方式提交表单,提交到我们的login请求--%>
-
- 用户名:"text" name="username">
- 密码:"password" name="password">
- 爱好:
- "checkbox" name="hobbies" value="女孩">女孩
- <%--多选框checkbox--%>
- "checkbox" name="hobbies" value="代码">代码
- "checkbox" name="hobbies" value="唱歌">唱歌
- "checkbox" name="hobbies" value="电影">电影
-
- "submit">
-
设置完毕之后,我们进行该类代码的编写:
- package com.rgf.servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.util.Arrays;
-
- public class LoginServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String username = req.getParameter("username");//getParameter获取单个参数
- String password = req.getParameter("password");
- String[] hobbies = req.getParameterValues("hobbies");//getP一组参数arameterValues获取
- System.out.println("=================================");
- System.out.println(username);
- System.out.println(password);
- System.out.println(Arrays.toString(hobbies));
- System.out.println("==================================");
- //resq.sendRedirect();重定向一个界面
- //this.getServletContext(); 请求转发
- resp.setCharacterEncoding("UTF-8");
-
- //通过请求转发
- req.getRequestDispatcher(req.getContextPath()+"success.jsp").forward(req,resp);
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req, resp);
- }
- }
为了达到请求转发到新的页面,我们可以设置新的jsp,如下所示:
之后我们修改了tomcat里面的配置:
然后进行运行后为如下所示:
我们进行该功能的判定:
我们将用户名和密码写进去之后,选好爱好,进行提交,我们发现出现如下界面:
我们发现404,我们回到IDEA,发现如下所示:
我们发现用户名和密码进行了输出,而问号代表乱码的输出。
我们修改代码,让其接收的时候也为utf-8的编码:
req.setCharacterEncoding("UTF-8"); //请求和响应都要这样子处理
我们进行修改了之后,重新运行如下所示:
但是我们提交之后,浏览器仍然显示的是404:
我们发现出错之后,我们修改一个转发的访问路径的代码如下所示:
req.getRequestDispatcher("/Request_war/success.jsp").forward(req,resp);
我们重新运行之后,我们发现还是出现404.这个时候我们思考所转发访问路径的代码是不是存在问题。 我们发现多了一个/,/为相对路径。这是进行转发,我们在进行转发之后,会默认加一个后缀,再加我们的路径。我们可以不用写根目录名字了。(转发是不需要写项目路径的,不需要写当前web应用的名字,重定向需要写)
我们所修改的代码如下所示:
req.getRequestDispatcher("/success.jsp").forward(req,resp);
我们进行运行后发现成功的登录成功了:
我们这个时候发现地址栏没有出现我们的登录信息了:
http://localhost:9571/Request_war/login
没有我们所输入的信息了,这是我们使用post方式与get方式不同的地方,get方式会裸露出来我们的登录信息。而post却不会这样子。
与此同时,我们不用带/进行请求的时候也可以达到同样的目的:
我们的代码如下所示:
req.getRequestDispatcher("success.jsp").forward(req,resp);
我们运行之后也成功的出现了登录成功的界面了:
面试题:请你聊聊重定向和转发的区别:
相同点:页面都会实现跳转
不同点:请求转发的时候,url不会产生变化(307)
重定向的时候,url地址栏会发生变化。(302)
我们再接下来会进行了解MVC三层架构。
dao(操作数据库的,用JDBC写的)
service层(业务层,平时写的代码)
servlet(这是往前端调的,我们把他称为控制层)controller