请求:Request
一、概述
Request对象用来解析请求参数,当浏览器访问服务器时,携带着一些请求参数,可以通过Servlet提供的Request对象提供的API来解析请求参数
请求对象有两个:
ServletRequest
httpServletRequest
二、常用的方法
getParameter("参数名")--根据参数名获取参数的值,但是只得到一个值
getParameterValues()--获取到所有参数的值并存入数组,但是得到多个值,存入数组
setCharacterEncoding()--设置请求的字符编码方式,如果请求参数中有中文,设置字符集为utf-8
getCharacterEncoding()--返回字符编码方式
setAttribute(String,Object) 存储此请求中的属性
getAttribute(String name) 返回指定属性的属性值
三、测试
1. 创建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.0">
<title>前端提交数据,后端解析数据</title>
</head>
<body>
<!-- 点击超链接跳转到Servlet -->
<!-- 点击超链接跳转到Servlet -->
<a href="http://localhost:8080/javaweb_war_exploded/ServletDemo05?name=jerry&pwd=123">点我,提交get数据1</a>
<a href="http://localhost:8080/javaweb_war_exploded/ServletDemo05?hobby=basketball&hobby=football">点我,提交get数据2</a>
</body>
</html>
2. 创建Servlet程序,解析请求参数
package cn.tedu.request;
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;
@WebServlet("/ServletDemo05")
public class ServletDemo05 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
//当用户以get方式提交数据时,Servlet会自动调用doGet()
//get方式提交的数据,可以一个一个的解析getParameter()
//也可以解析多个值getParameterValues()
//如果使用的是Tomcat7.0以上的版本,get方式提交中文数据不会乱码
protected
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.request 解析请求参数 name=Jerry&pwd=123
//1.1获取一个值
String s = request.getParameter("name");//获取name参数的值
System.out.println(s);
String pwd = request.getParameter("pwd");//获取name参数的值
System.out.println(pwd);
//1.2获取到多个值
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
}
}
3. 效果
测试1:
测试2:
四、模拟Servlet解析请求参数
创建MyRequest 类
package cn.tedu;
//模拟Servlet解析请求参数的对象Request
public class MyRequest {
public static void main(String[] args) {
//this是代表的本类对象,static里不能出现this,原因就是加载顺序
// this.getParamter();
MyRequest my = new MyRequest();
my.getParamter();
}
//1.getParamter()获取每个请求参数
public void getParamter(){
String url="http://localhost:8080/javaweb_war_exploded/ServletDemo06" +
"?user=jack&pwd=123";
//1.按照?切割字符串,切出来两部分,存入数组
//[http://localhost:8080/javaweb_war_exploded/ServletDemo06,?user=jack&pwd=123]
String[] strs = url.split("\\?");//转义
//2.重点解析数组中的第二个元素,下标为1的元素user=jack&pwd=123
String datas = strs[1]; //user=jack&pwd=123
//3,把第二步的结果,按照&切割
// [user=jack,pwd=123]
String[] data = datas.split("&");
//4,遍历数组,获取每个数据
for (String s : data) { //遍历两次,第一次s是user=jack,第二次s是pwd=123
//5,按照=切割,得到数组 [user,jack],只要第二个元素
//String params = s.split("=")[1];
String[] ss = s.split("=");
String params = ss[1];
System.out.println(params);
}
}
}
优化MyRequest 类
package cn.tedu;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
//模拟Servlet解析请求参数的对象Request
public class MyRequest {
public static void main(String[] args) {
//this是代表的本类对象,static里不能出现this,原因就是加载顺序
// this.getParamter();
MyRequest my = new MyRequest();
//查询指定参数名对应的值
String u = my.getParamter("pwd");
System.out.println(u);
}
//1.getParamter()获取每个请求参数
public String getParamter(String keyword){
/*
String url="http://localhost:8080/javaweb_war_exploded/ServletDemo06" +
"?user=jack&pwd=123";
//1.按照?切割字符串,切出来两部分,存入数组
//[http://localhost:8080/javaweb_war_exploded/ServletDemo06,?user=jack&pwd=123]
String[] strs = url.split("\\?");//转义
//2.重点解析数组中的第二个元素,下标为1的元素user=jack&pwd=123
String datas = strs[1]; //user=jack&pwd=123
//3,把第二步的结果,按照&切割
// [user=jack,pwd=123]
String[] data = datas.split("&");
//4,遍历数组,获取每个数据
for (String s : data) { //遍历两次,第一次s是user=jack,第二次s是pwd=123
//5,按照=切割,得到数组 [user,jack],只要第二个元素
//String params = s.split("=")[1];
String[] ss = s.split("=");
String params = ss[1];
System.out.println(params);
*/
String url="http://localhost:8080/javaweb_war_exploded/ServletDemo06" +
"?user=jack&pwd=123";
String[] data = url.split("\\?")[1].split("&");
//Map存数据有特性,数据必须以键值对的形式存在,可以根据key找value
Map<String,String> map = new ConcurrentHashMap<>();
//4,遍历数组,获取每个数据
for (String s : data) { //遍历两次,第一次s是user=jack,第二次s是pwd=123
//5,按照=切割,得到数组 [user,jack],只要第二个元素
//String params = s.split("=")[1];
String[] ss = s.split("=");
String value = ss[1];
String key = ss[1];
map.put(key,value); //存入map
}
return map.get(keyword);
}}
五、使用表单提交数据
1.创建HTML文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="http://localhost:8080/javaweb_war_exploded/ServletDemo06">
<h3>测试 get提交数据</h3>
姓名:<input type="text" placeholder="请输入姓名..." name="user" /> <br /> 密码:
<input type="password" placeholder="请输入密码..." name="pwd" /> <br />
<input type="submit" value="提交" />
</form>
<form method="post" action="http://localhost:8080/javaweb_war_exploded/ServletDemo06">
<h3>测试 post提交数据</h3>
姓名:<input type="text" placeholder="请输入姓名..." name="user" /> <br /> 密码:
<input type="password" placeholder="请输入密码..." name="pwd" /> <br />
<input type="submit" value="提交" />
</form>
</body>
</html>
2.创建Servlet程序
package cn.tedu.request;
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("/ServletDemo06")
public class ServletDemo06 extends HttpServlet {
//总结1:
//Servlet什么时候会自动调用doPost()?
// Servlet会调用getMethod()来获取用户的访问方式,如果是POST会调用doPost()
//Servlet什么时候会自动调用doGet()?
// Servlet会调用getMethod()来获取用户的访问方式,如果是GET会调用doGet()
//处理post方式提交的数据——如果请求参数包含中文,一定出现中文代码!
//总结2:中文乱码问题?
// get方式提交数据没有乱码问题,Tomcat已经配置好了(URIEncoding="utf-8"),不必关心
// post方式提交的数据如果有中文一定乱码,request.setCharacterEncoding("utf-8");
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证,请求方式是post吗?
String method = request.getMethod();
//指定请求的方式使用的编码——解决中文乱码
request.setCharacterEncoding("utf-8");
String name = request.getParameter("user");
String pwd = request.getParameter("pwd");
System.out.println("doPost...." + name + pwd + "...." + method);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证,请求方式是get吗?
String method = request.getMethod();
String user = request.getParameter("user");
String pwd = request.getParameter("pwd");
System.out.println("doGet..." + user + pwd + "..." + method);
}
}
六、综合案例
1.需求
综合案例:
- 准备前端HTML网页,让用户输入部门数据(编号,名称,地址)
- 准备DeptServlet,接受请求,并且解析请求参数
- 把解析成功的请求参数,进行入库
- 准备jar包
- 准备dept表(deptno,dname,loc)
- 准备jdbc代码,进行insert的SQL语句操作
2.创建HTML网页
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>前后端大融合</title>
<style>
input[type='text'] {
width: 200px;
/* 宽度*/
height: 30px;
/* 高度 */
background-color: pink;
/* 背景色 */
border-color: pink;
/* 边框色 */
border-radius: 10px;
/* 圆角边框 */
}
input[type="submit"] {
width: 80px;
/* 宽度*/
height: 40px;
/* 高度 */
background-color: gray;
/* 背景色 */
border-color: gray;
/* 边框色 */
color: white;
/* 文字的颜色 */
font-size: 20px;
/* 字号大小 */
}
</style>
</head>
<body>
<form method="post" action="http://localhost:8080/javaweb_war_exploded/DeptServlet">
<h1>添加部门数据</h1>
<h3>编号:<input type="text" name="deptno" /></h3>
<h3>名称:<input type="text" name="dname" /></h3>
<h3>地址:<input type="text" name="loc" /></h3>
<input type="submit" value="保存" />
</form>
</body>
</html>
3.创建DeptServlet类
package cn.tedu.dept;
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("/DeptServlet")
public class DeptServlet extends HttpServlet {
//用户以post方式提交的数据,doPost()解析请求参数
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//防止中文乱码
request.setCharacterEncoding("utf-8");
//用来获取网页中传递来的参数getParameter的参数是网页中name属性的值
String a = request.getParameter("deptno");
String b = request.getParameter("dname");
String c = request.getParameter("loc");
System.out.println(a + b + c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post提交的,不能写在这里
}
}
七、请求转发
1.概述
请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程,就叫做请求转发,具有以下特点:
1,请求转发整个过程是一次请求、一次响应
2,请求转发前后,浏览器地址栏地址不会发生变化(浏览器–访问–>A–转发–>B,地址栏地址始终指向A的地址)
3,请求转发前后的request对象是同一个
4,转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发
5,使用代码: request.getRequestDispatcher
(访问目的资源的路径).forward(request,response);
6,也可以使用 setAttribute()/getAttribute()来验证
2.测试
创建文件
AServlet
package cn.tedu.forwardtest;
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("/AServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("AServlet被执行!");
//实现请求转发:想让AServlet调用BServlet,本质上这是服务器的动作,浏览器没变化发现不了
//要求:两个资源可以互相调用,但是要求两个资源必须在同一项目中
//getRequestDispatcher()的参数是,对方的访问方式
//请求转发本质上就是一次请求:在AServlet添加请求的数据,试试BServlet也能获取到就可以了
request.setAttribute("name","rose");
request.getRequestDispatcher("/BServlet").forward(request,response);
}
}
BServlet
package cn.tedu.forwardtest;
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("/BServlet")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BServlet被执行!");
//获取在AServlet中存入的数据,其实就是根据key获取value
Object data = request.getAttribute("name");
System.out.println(data);
}
}