typora-copy-images-to: img

day02-http&request

学习目标

-[ ] 能够使用工具查看HTTP协议内容
-[ ] 能够理解HTTP协议请求内容
-[ ] 能够使用Request对象获取HTTP协议请求内容(重点)
-[ ] 能够处理HTTP请求参数的乱码问题 (重点)
-[ ] 能够使用Request域对象 (重点)
-[ ] 能够使用Request对象做请求转发
-[ ] 能够完成登录案例

第一章 HTTP协议及请求报文

1、HTTP协议的概念及作用

目标: 解释说明HTTP协议的概念及作用

步骤:

1、登录案例中BS数据交互流程:

2、概念:HTTP协议(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议;

3、作用:规定了浏览器和服务器之间传输数据的格式;

小结:

1、HTTP协议概念及作用:概念:HTTP协议(超文本传输协议)是互联网上应用最为广泛的一种网络协议;作用:规定了浏览器和服务器之间数据传输的格式;
2、HTTP协议版本:HTTP1.0:发送一次请求,创建一个连接,获取一个网络资源,断开连接;HTTP1.1:发送一次请求,创建一个连接,获取多个网络资源,断开连接;

2、HTTP协议的特点

1、HTTP协议是基于请求和响应模型的协议,请求和响应成对出现,先有请求后有响应;
2、HTTP协议默认端口是80;

3、HTTP协议的结构

HTTP协议的结构包括两部分:请求报文,响应报文;

1. 请求报文:浏览器给服务器发送的请求数据的格式。请求报文主要包括:请求行 ,请求头 ,请求体 。
2. 响应报文:服务器给客户端(浏览器)响应的报数据格式。响应报文主要包括:响应行 ,响应头 ,响应体 ;

4、请求报文

  浏览器可以抓取请求的数据,但是现在的浏览器都对请求的参数在格式上进行了优化。如果想要看到原始的请求报文,需要使用到工具。本次课程使用Fiddler这个工具对请求数据进行抓取分析。

4.1 抓取请求报文

目标: 使用软件Fiddler抓取请求报文

步骤:

1、安装Fiddler,然后打开;

2、创建web项目,编写一个能够发送get和post请求的表单;

3、启动项目,访问表单页面,分别发送get和post请求;

4、查看Fiddler中抓取的get请求和post请求的报文;

实现:

第一步:安装Fiddler,然后打开;

第二步:创建web项目并编写以下页面

【http_demo.html】

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>GET请求</h2><form action="#" method="get">用户名:<input type="text" name="userName" value="zhangsan" /><br>密码:<input type="text" name="pwd" value="123" /><br><input type="submit" value="提交"/></form><h2>POST请求</h2><form action="#" method="post">用户名:<input type="text" name="userName" value="zhangsan"/><br>密码:<input type="text" name="pwd" value="123"/><br><input type="submit" value="提交"/></form>
</body>
</html>

第三步:分别提交get和post表单,并查看截取的请求报文;

【get请求的原始报文】

【post请求的原始报文】

4.2 请求报文分析

目标:分析请求报文

步骤:

1、观察get请求的请求报文,并划分出请求行,请求头,请求体;

2、观察post请求的请求报文,并划分出请求行,请求头,请求体;

3、总结;

实现:

1、观察get请求的请求报文,并划分出请求行,请求头,请求体;

2、观察post请求的请求报文,并划分出请求行,请求头,请求体;

小结:

1、请求报文的组成:请求行,请求头,请求体;
2、get请求报文的特点:【1】没有请求体;【2】提交数据的方式:在url后面拼接,格式:url?name1=value1&name2=value2
3、post请求报文的特点:【1】有请求体;【2】提交请求数据的方式:在请求体中,格式:name1=value1&name2=value2

5、HTTP协议小结

1. HTTP:超文本传输协议,定义了浏览器与服务器之间数据传输的格式;
2. HTTP协议组成:1. 请求报文:请求行,请求头,请求体;1. 请求行:请求报文中的第一行数据,包括**请求方式**,**URL** ,**协议/版本** ;2. 请求头:以键值对的数据格式,给服务器传输数据。常用的请求头:user-agent,cookie;3. 请求体:get请求:没有请求体;post请求:请求体传递请求参数;2. 响应报文:响应行,响应头,响应体;

第二章 HttpServletRequest

1、HttpServletRequest及其作用

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

目标: 解释说明request对象及其作用

步骤:

1、概念:HttpServletRequest对象代表客户端的请求,封装了请求信息;

2、画图分析:

实现:

1、概念:

HttpServletRequest对象代表客户端的请求,封装了请求信息;

2、request工作原理图

小结:

1、HttpServletRequest对象:HttpServletRequest对象代表了客户端的请求,封装了请求信息;
2、HttpServletRequest对象的作用:封装请求数据(请求行,请求头和请求体)以及一些API;

2、Request常用API

request对象将请求数据封装并且提供了获取这些请求数据的API,这些API可以分为以下几类:1. 获取请求行信息:请求方式,url和HTTP版本。
2. 获取请求头信息:浏览器类型,ip地址等。
3. 获取请求参数:url后面拼接的参数或者请求体中提交的参数;

2.1 获取请求行信息

请求行中包含请求方式,url和协议/版本信息,以下API可获得这些信息。

方法 说明
String getMethod() 获取请求方式的类型
StringBuffer getRequestURL() 获取客户端发出请求完整URL
String getRemoteAddr() 获取IP地址
String getProtocol() 获取当前协议的名称和版本

目标:使用request对象获取请求头信息

步骤:

1、创建一个Servlet类:RequestRowServlet;

2、设置映射路径为:/requestRowServlet;

3、在doGet方法中分别调用request的以下方法,并打印;

getMethod():获取请求方式
getRequestURL():获取请求的url
getRemoteAddr():获取请求的ip地址
getProtocol():获取当前协议的名称和版本

4、访问/requestRowServlet查看控制台上的打印信息:

实现:

1、创建一个Servlet类:RequestRowServlet;

package com.heima.web;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;/*** @author buguniao* @version v1.0* @date 2018/12/8 22:34* @description TODO**/
@WebServlet(urlPatterns = "/requestRowServlet")
public class RequestRowServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

2、设置映射路径为:/requestRowServlet;

3、在doGet方法中分别调用request的以下方法,并打印;

getMethod():获取请求方式
getRequestURL():获取请求的url
getRemoteAddr():获取请求的ip地址
getProtocol():获取当前协议的名称和版本@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求行的请求方式String method = request.getMethod();System.out.println("method = " + method);//获取请求行的请求URLStringBuffer requestURL = request.getRequestURL();System.out.println("requestURL = " + requestURL);//获取请求行的请求IPString remoteAddr = request.getRemoteAddr();System.out.println("remoteAddr = " + remoteAddr);//获取请求行的协议版本号String protocol = request.getProtocol();System.out.println("protocol = " + protocol);}

4、启动tomcat,访问这个servlet,查看控制台打印信息;

method = GET
requestURL = http://localhost:8080/httpRequestServlet
remoteAddr = 0:0:0:0:0:0:0:1
protocol = HTTP/1.1

小结:

1、获取请求行的API:获取请求方式:getMethod()获取请求url:getRequestURL()获取请求的ip:getRemoteAddr()获取请求的协议/版本号:getProtocol()2、注意事项:当请求的ip为localhost的时候,getRemoteAddr方法获取的是IPv6的格式。

2.2 获取请求头信息

浏览器的请求头信息是由很多:关键字:值 形式的数据组成的。HttpServletRequest对象给我们提供了两个方法用来获取请求的头信息。

方法 作用
String getHeader(String name) 根据请求头的k关键字获取请求头信息
Enumeration getHeaderNames() 返回此请求包含的所有头信息的枚举

【说明】请求头的k关键字如下表所示:

   请求头key                        请求头value                referer         浏览器通知服务器,当前请求来自何处,如果是直接访问,则不会有这个头。常用于:防盗链

If-modified-Since 浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。
cookie 与会话有关技术,用于存放浏览器缓存的cookie信息。
user-agent 浏览器通知服务器,客户端浏览器与操作系统相关信息
connection 保持连接状态。Keep-Alive 连接中,close 已关闭
host 请求的服务器主机名
content-length 请求体的长度
content-type 如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码
accept 浏览器可支持的MIME类型。文件类型的一种描述方式。
mime格式 浏览器请求数据的类型,例如: text/html ,html文件 text/css,css文件 text/javascript,js文件 image/*,所有图片文件
accept-encoding 浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩
accept-language 浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)
… …

目标: 使用request对象获取常用请求头信息

步骤:

1、创建一个Servlet类RequestHeaderServlet,设置映射地址为/requestHeaderServlet;

2、在doGet方法中获取请求头user-agent的值和所有的请求头的name值;

3、将获取的结果打印输出到控制台上;

4、启动tomcat,访问该Servlet;

实现:

1、创建一个Servlet类RequestHeaderServlet,设置映射地址为/requestHeaderServlet;

package com.heima.web;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;/*** @author buguniao* @version v1.0* @date 2018/12/8 23:09* @description TODO**/
@WebServlet(urlPatterns = "/requestHeaderServlet")
public class RequestHeaderServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

2、在doGet方法中获取请求头user-agent的值和所有的请求头的name值;

    @Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//请求头学习//获取user-agent 对应value值String header = request.getHeader("user-agent");System.out.println("user-agent = " + header);//获取所有请求key信息Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()){System.out.println(headerNames.nextElement());}}

3、将获取的结果打印输出到控制台上;

4、启动tomcat,访问该Servlet,查看控制台上的打印信息;

user-agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
host
connection
cache-control
upgrade-insecure-requests
user-agent
accept
accept-encoding
accept-language
cookie

小结:

1、获取指定请求头的信息: request.getHeader("name");
2、获取所有的请求头的key值:request.getHeaderNames();
3、常用请求头:user-agent

2.3 获取请求数据【重要】

通过第一章中获取请求参数可以得出结论:

1、get请求提交请求数据:方式:在url后面拼接格式:url?name1=value1&name2=value2
2、post请求提交请求数据:方式:通过请求体提交数据格式:name1=value1&name2=value2
3、结论:提交数据的格式都是:name=valuename值为表单中标签的name属性值

由于get和post请求提交数据的格式都是name=value,request给我们提供了getParameter(name)方法,获取指定name属性值的标签提交的value值。

request获取请求数据的API如下:

方法名 描述
String getParameter(String name) getParameter获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。 例如:username=jack
String[] getParameterValues(name) getParameterValues[] 获取请求数据key相同的多个数据
request.getParameterMap(); 获得所有表单的数据,封装到map中

目标: 使用request对象的API获取表单提交的数据

步骤:

1、编写注册页面register.html;

2、编写Servlet类接收注册页面提交的数据;

3、在Servlet类中分别使用上述3个API获取表单提交的数据,并打印到控制台上;

4、启动tomcat,访问注册页面,填写数据并提交。在后台控制台中查看打印信息;

实现:

1、编写注册页面register.html;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/registerServlet" method="post">用户名:<input type="text" name="username"/><br/>密码:<input type="password" name="password"/><br/>爱好:<input type="checkbox" name="hobby" value="smoking"/> 抽烟<input type="checkbox" name="hobby" value="drinking"/> 喝酒<input type="checkbox" name="hobby" value="tangtou"/> 烫头 <br/>学历:<select name="education"><option value="gaozhong">高中</option><option value="dazhuan">大专</option><option value="benke">本科</option></select><br><input type="submit" value="post提交"/>
</form>
</body>
</html>

2、编写Servlet类接收注册页面提交的数据;

package com.heima.web;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.Arrays;
import java.util.Map;/*** @author buguniao* @version v1.0* @date 2018/12/8 23:33* @description TODO**/
@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//非常重要API  请求参数/请求体API//获取用户名System.out.println("============getParameter方法获取指定name的value值===================");String username = request.getParameter("username");System.out.println("username = " + username);String password = request.getParameter("password");System.out.println("password = " + password);//请求爱好System.out.println("===============getParameterValues根据name获取多个value值===================");String[] hobbies = request.getParameterValues("hobby");String s = Arrays.toString(hobbies);System.out.println("s = " + s);//获取表单所有信息System.out.println("===============getParameterMap获取所有的数据封装到map中==================");Map<String, String[]> parameterMap = request.getParameterMap();//获取用户输入所有值for (String key : parameterMap.keySet()) {System.out.println(key+"="+Arrays.toString(parameterMap.get(key)));}}
}

3、在Servlet类中分别使用上述3个API获取表单提交的数据,并打印到控制台上;

4、启动tomcat,访问注册页面,填写数据并提交。在后台控制台中查看打印信息;

小结:

1、根据name值获取value值: request.getParameter();
2、根据name值获取多个value值:request.getParameterValues();
3、获取所有的请求数据,封装到map中:request.getParameterMap();
注意事项:请求数据的获取都是根据表单项的name值获取,如果表单项中没有name属性,数据将不会被提交到服务器,后台也就无法获取。

【注意事项】中文乱码问题

描述:post请求提交的中文数据,在Servlet中获取会乱码

1、POST请求提交数据乱码问题:原因:tomcat接收post请求数据采用的编码是ISO-8859-1,而我们的整个编码环境都是UTF-8。所以会导致乱码。解决方法:1、将tomcat编码改为UTF-8;2、Servlet中获取数据前,将request编码设置为UTF-8:request.setCharacterEncoding("UTF-8");2、GET请求提交的中文数据乱码问题已经被tomcat处理:

第三章 request作用域

1、request的生命周期

目标: 演示request的生命周期

步骤:

第一步:解释说明生命周期的概念;
第二步:画图描述request对象的生命周期;

实现:

第一步:解释说明生命周期的概念;

生命周期指的是一个对象从创建,发挥作用,到销毁的整个过程。

第二步:画图描述request对象的生命周期;

小结:

1、request生命周期小结:创建:请求到达服务器后,tomcat解析数据,创建request对象,将数据封装到request对象中;工作:在servlet中从request中获取数据或其他操作;销毁:这次请求完成,响应结束后request和response对象就销毁了;
2、request生命周期特点:创建:每一次请求都会创建一个新的request对象;存活时间:request和response只存活于一次请求和响应期间;

2 、request域对象

2.1 域对象及其作用

目标: 解释说明域对象及其作用

步骤:

1、域对象:一个拥有作用范围的对象
2、作用:存储数据

实现:

1、域对象:一个拥有作用范围的对象

request的作用范围(生命周期):一次请求和响应之间

2、request域存储数据相关API:

方法 说明
void setAttribute(String name, Object o) 往request域中设置值
Object getAttribute(String name) 从request域中取值
void removeAttribute(String name) 从request域中移除值

小结:

1、request域对象的作用:存储数据
2、request域对象存储数据常用方法:setAttribute(name,object)   存数据getAttribute(name)           取数据removeAttribute(name)        移除数据
3、request域对象的作用范围:在一次请求和响应之间

2.2 request域对象API的使用

目标: 演示request域对象API的使用

步骤:

1、request域对象常用API:
2、创建一个Servlet类RequestScopeServlet使用上面3个方法:
3、访问这个Servlet,观察数据存取情况;

实现:

1、request域对象常用API:

setAttribute(name,object)    存数据
getAttribute(name)          取数据
removeAttribute(name)       移除数据

2、创建一个Servlet类RequestScopeServlet使用上面3个方法:

package com.heima.web;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;/*** @author buguniao* @version v1.0* @date 2018/12/9 10:50* @description TODO**/
@WebServlet(urlPatterns = "/requestScopeServlet")
public class RequestScopeServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示rrquest域对象的常用API//存值request.setAttribute("name", "张三");//取值String name1 = (String) request.getAttribute("name");System.out.println("从request中获取name1="+name1);//移除值request.removeAttribute("name");String name2 = (String) request.getAttribute("name");System.out.println("从request中获取name2=" + name2);}
}

3、访问这个Servlet,观察数据存取情况;

从request中获取name1=张三
从request中获取name2=null

小结:

1、request作用域常用API:存值: setAttribute(name,object);取值: getAttribute(name);移除值:removeAttribute(name);
2、注意区别:request.getAttribute(name):从rquest域对象中取值request.getParameter(name):从rquest中获取请求数据
3、request域对象存储数据的作用范围:一次请求和响应之间两者区别:
①getParameter()获取的是客户端设置的数据。
getAttribute()获取的是服务器设置的数据。
②getParameter()永远返回字符串
getAttribute()返回值是任意类型

3、 请求转发

3.1 请求转发原理阐述

目标: 阐述请求转发的原理

步骤:

第一步:概念说明在服务器内部,将本次请求传递给另外一个Servlet或html;
第二步:画图演示

实现:

第一步:请求转发的概念

在服务器内部,将本次请求传递给另外一个Servlet或html,实现业务逻辑的跳转;

第二步:画图分析

小结:

1、转发的概念:服务器内部完成请求的跳转,可以跳转到一个Servlet或html;
2、整个转发过程对应的请求与响应次数:一次请求,一次响应
3、转发的作用:实现业务逻辑跳转共享request域中的数据

3.2 请求转发应用案例

目标: 请求转发案例实现

步骤:

第一步:请求转发API
第二步:编写页面模拟人事发送请求,到MyServlet;
第三步:编写MyServlet和OtherServlet;
第四步:在MyServlet中获取请求数据,然后转发到OtherServlet;
第五步:在OtherServlet中处理请求,完成响应;
第六步:启动tomcat,发送请求测试;

实现:

第一步:请求转发API

方法 说明
RequestDispatcher getRequestDispatcher(String path) 获取请求转发器(request对象方法)
void forward(ServletRequest request, ServletResponse response) 将请求转发到另一个资源(Servlet)上

第二步:编写页面模拟人事发送请求,到MyServlet;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>模拟人事发送邮件</title>
</head>
<body><h2>人事发送面试邮件</h2><form action="/myServlet">邮件正文:<textarea name="msg" id="" cols="30" rows="10"></textarea><br><input type="submit" value="发送邮件"></form>
</body>
</html>

第三步:编写MyServlet和OtherServlet;

【MyServlet】

package com.heima.dispatcher;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;/*** @author buguniao* @version v1.0* @date 2018/12/9 11:34* @description TODO**/
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

【OtherServlet】

package com.heima.dispatcher;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;/*** @author buguniao* @version v1.0* @date 2018/12/9 11:36* @description TODO**/
@WebServlet(urlPatterns = "/otherServlet")
public class OtherServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

第四步:在MyServlet中获取请求数据,然后转发到OtherServlet;

【MyServlet】

package com.heima.dispatcher;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;/*** @author buguniao* @version v1.0* @date 2018/12/9 11:34* @description TODO**/
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、接收请求数据String msg = request.getParameter("msg");System.out.println(msg);//2、处理数据:转给OtherServlet处理request.setAttribute("msg2", "帮忙面试一下!");request.getRequestDispatcher("/otherServlet").forward(request,response);//3、响应数据}
}

第五步:在OtherServlet中处理请求,完成响应;

【OtherServlet】

package com.heima.dispatcher;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;/*** @author buguniao* @version v1.0* @date 2018/12/9 11:36* @description TODO**/
@WebServlet(urlPatterns = "/otherServlet")
public class OtherServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、获取请求数据String msg = request.getParameter("msg");String msg2 = (String) request.getAttribute("msg2");//2、处理数据:System.out.println(msg);System.out.println(msg2);System.out.println("正在面试.....................");//3、响应数据response.getWriter().println("this man is ok!");}
}

第六步:启动tomcat,发送请求测试;

小结:

1. 转发是服务器内部的跳转行为;
2. 从一个Servlet转发到另一个资源(静态或动态),能够实现跳转,但是浏览器地址栏地址没有发生改变。因为对浏览器来说本质上就只有一次请求;
3. 请求转发的作用:共享request域中的数据;

第四章 登录案例

截止到目前,我们已经能够使用所学的知识完成一个完整的从前端到后台的登录案例了。

1、需求

1. 要求基于所学知识,设计登录表单页面,数据库用户表user (字段 id,userName,password),通过sql手动插入若干用户数据记录。
2. 基于form表单数据提交,将客户端用户输入的账号和密码发送给服务器Servlet
3. Servlet获取表单提交的账号和密码数据,基于所学的JdbcTemplate直接访问数据库t_user表,查询账号和密码是否正确
4. 根据数据库查询的结果,如果账号密码错误,转发到error.html。账号密码都正确转发到success.html页面。

2、用户登录实现

2.1 数据库设计

 数据库名称:自定义即可,表名:t_user  字段:id  username,password

(可以基于数据库图形软件,navicat、sqlyoung等工具完成,牛逼的学员可以手动编写sql脚本)

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(255) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2 设计登录页面

 新建一个web项目,设计登录页面login.html。效果图如下:<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>登录页面</title><link href="css/bootstrap.min.css" rel="stylesheet"><link href="css/login.css" rel="stylesheet"><script src="js/jquery.js"></script><script src="js/bootstrap.js"></script>
</head>
<body><div class="container text-center"><form class="form-signin" action="http://localhost:8080/loginServlet"><h2 class="form-signin-heading">登录页面</h2><input type="email"  name="username" class="form-control" placeholder="用户名" required autofocus><input type="password"  name="password" class="form-control" placeholder="密码" required><button class="btn btn-lg btn-primary btn-block" type="submit">登录</button></form></div></body>
</html>

其他静态页面如下:

2.3 后台环境搭建

在src下创建如下包:com.heima.login.web
com.heima.login.service
com.heima.login.dao
com.heima.login.bean
com.heima.login.utils在WEB-INF目录下新建lib包,将jar包导入,并将jar包添加到项目的library中:

如果每个jar包前出现小三角符号,则说明jar包导入成功:

2.4 工具类和c3p0-config.xml

1.登录案例中会用到DataSourceUtils.java工具类,代码如下

package com.heima.login.utils;import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;public class DataSourceUtil {//静态成员变量在类加载的时候被调用    只被调用一次private static DataSource dataSource = new ComboPooledDataSource();/*** 获取数据源* @return*/public static DataSource getDataSource() {return dataSource;}/*** 获取jdbctemplate* @return*/public static JdbcTemplate getJdbcTemplate() {return new JdbcTemplate(dataSource);}
}

2.c3p0-config.xml配置文件

c3p0-config.xml配置文件需要放到src下面。<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql:///yun6</property><property name="user">root</property><property name="password">root</property><property name="acquireIncrement">2</property><property name="initialPoolSize">5</property><property name="minPoolSize">1</property><property name="maxPoolSize">5</property></default-config>
</c3p0-config>

3、登录业务流程分析

4、编码

4.1、编写实体类

package com.heima.login.bean;public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}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;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + username + '\'' +", password='" + password + '\'' +'}';}
}

4.2、编写LoginServlet处理登录业务

package com.heima.login.web;import com.heima.login.domain.User;
import com.heima.login.service.UserService;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(urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理登录业务逻辑//处理post请求乱码request.setCharacterEncoding("UTF-8");//1.获取请求数据String userName = request.getParameter("username");String password = request.getParameter("password");//封装数据 javabeanUser user = new User();user.setUserName(userName);user.setPassword(password);//2.处理数据  调用UserService 处理登录UserService userService = new UserService();//true  登录成功   false:登录失败boolean flag = userService.login(user);//3.响应数据if (flag) {//登录成功  转发到success.htmlrequest.getRequestDispatcher("/success.html").forward(request, response);}else {request.getRequestDispatcher("/error.html").forward(request, response);}}
}

【Service层】

package com.heima.login.service;import com.heima.login.dao.UserDao;
import com.heima.login.domain.User;public class UserService {//登录public boolean login(User user) {//处理业务逻辑UserDao userDao = new UserDao();User loginUser = userDao.queryUserByUserNameAndPassword(user);//        if (null == loginUser) {
//            return  false;
//        }else {
//            return  true;
//        }//return loginUser == null ? false : true;return  loginUser != null;}
}

【Dao层】

package com.heima.login.dao;import com.heima.login.domain.User;
import com.heima.login.utils.DataSourceUtil;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;public class UserDao {//处理登录public User queryUserByUserNameAndPassword(User user) {//创建模板JdbcTemplate jdbcTemplate = DataSourceUtil.getJdbcTemplate();//String sqlString sql = "select * from t_user where userName = ? and password = ?";//查询try {return  jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(User.class),user.getUserName(),user.getPassword());} catch (DataAccessException e) {e.printStackTrace();return  null;}}
}

http以及HttpServletRequest详解相关推荐

  1. HttpServletResponse,HttpServletRequest详解

    HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求 ...

  2. java request获取域,Java Web - Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(二)...

    Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据.请求分派.请求域)(2) HttpServletRequest ----------------- ...

  3. HttpServletResponse和HttpServletRequest详解——Web网络学习笔记

    一.HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以 ...

  4. http请求HttpServletRequest详解

    目录 1.  HttpServletRequest概述 2.  request的运行流程 3. 抓包获取的http请求信息 4. 通过requestd对象获得 "请求行" 5. 通 ...

  5. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)

    HttpServletResponse简介 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和re ...

  6. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)

    HttpServletRequest获取请求头信息  (1)获取客户机请求头 String getHeader(String name) Enumeration<String> getHe ...

  7. 会话技术之Cookie详解

    很早之前写过一篇关于Cookie和Session的文章,那是2017年的事咯,当时还是个学生,技术也菜,对知识理解的也不深.恰巧有机会重新学习Java Web,今天就再次来简单的聊一聊Cookie与S ...

  8. 【JavaWeb】Servlet系列——HttpServletRequest接口详解

    文章目录 23 HttpServletRequest接口详解 23.1 关于HttpServletRequest接口 23.2 HttpServletRequest接口的实现类谁写的? HttpSer ...

  9. spring boot 实战 / 可执行war启动参数详解

    概述   上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...

最新文章

  1. Java多种方式读文件,追加文件内容,等对文件的各种操作
  2. Redis源码试读(一)源码准备
  3. 安装nginx及依赖包
  4. gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...
  5. C语言字符串库函数的实现
  6. Facebook广告设定技巧经验分享
  7. python从入门到精通-小白如何系统学习python,从入门到精通?
  8. Multi-statement transaction required more than ‘max_binlog_cache_size‘ bytes of storage
  9. 《WinForm开发系列之控件篇》Item65 VScrollBar (暂无)
  10. 如何将图片素材转为矢量图?
  11. php 正则不贪婪,正则表达式之 贪婪与非贪婪模式详解(概述)
  12. 【IoT】NFC 应用技术全面解析
  13. STM32普通IO模拟SPI和W25Q32通信调试
  14. 工资3000,靠“视频剪辑”月入40000:会赚钱的人,从不靠拼命!
  15. 滴滴Uber神州易到,共享出行四国军棋沙盘推演
  16. 香港科大三项研究登榜2020年度香港十大创科新闻
  17. Linux系统常见目录分类
  18. zcmu oj 1087: 统计字符
  19. 易语言 图片插入超级列表框_新手教程!如何在PDF文件中插入图像
  20. 对话 H3C CloudCell 云业务单元一体机-张栋(CloudCell)

热门文章

  1. 他通过使用计算机解决了这个问题英文翻译,答案后科技英文翻译.doc
  2. 无敌了,用Python给英语老师开发了个英语作文批改的神器(支持小学到雅思)
  3. 通俗的讲解调制与解调
  4. 智能手机的ESD测试
  5. 内容带分隔符的字符串分隔处理
  6. 一个可以轻松上手绘画的小程序
  7. 和大家一起了解一下深圳
  8. PPT之对人脸模糊处理
  9. File打印文件内容,输出内容
  10. kissy ajax,KISSY入门篇