目录
请求Request
HttpServletRequest
表示
Http
环境中的
Servlet
请求。它扩展于
javax.servlet.ServletRequest
接⼝
)
常⽤6个⽅法:
1)String getParameter(String name)
根据表单组件名称name获取提交的数据,返回值是
String
注:服务器在接收数据时使⽤字符串统⼀接收
2)String[ ] getParameterValues(String name)
获取表单组件对应多个值时的请求数据比如复选框
3)void setCharacterEncoding(String charset)
指定每个请求的编码
(
针对
post
请求才起作⽤
)
4)RequestDispatcher getRequestDispatcher(String path)
--
跳转⻚⾯,当用户发送的请求在servlet中被允许后跳转到其它页面展示给用户。
返回⼀个
RequestDispatcher
对象,该对象的
forward( )
⽅法⽤于转发请求
/表示web目录
![](https://i-blog.csdnimg.cn/blog_migrate/0424cd5a0f793e19affba81c742ef3ce.png)
5)存值 request.setAttribute("key",value);
6)取值 request.getAttribute("key");
//
取值后需要向下转型
![](https://i-blog.csdnimg.cn/blog_migrate/26d0d995cba5edd6849b24338cf3cbc8.png)
存值取值成对出现
前台通过超链接或表单给后台数据:后台通过req.getParameter()获取
后台通过req.setAttribute("key",value)给前台数据:在跳转页面通过req.getAttribute("key")获取数据传给前台
request存值范围 :是单次请求有效,也就是一个来回的请求和响应期间这个值有效。
补充1:客户端如何发送数据给服务器
⽅式1:通过表单 get/post提交
⽅式2:通过a标签发送数据(get提交)
![](https://i-blog.csdnimg.cn/blog_migrate/482b082f7bda22b1353e5f05d0fba04e.png)
这⾥的
key
值
=
表单元素的控件名,
value
值
=
表单中控件的
value
属性值
注
:
第⼀个参数使⽤
?
拼接
,
之后的参数使⽤
&
拼接,
获取数据还是通过 String name=request.getParameter("name");
⽅式3:通过地址栏直接拼接-get请求
⽅式4:js提交数据-get请求
location.href="
⽬标请求
?key=value&key=value"
补充2:处理请求乱码的问题(get/post分别怎么处理乱码)
⽅式
1
:
setCharacterEncoding("UTF-8");//post
提交时管⽤
⽅式
2: String s=new String(
变量名
.getBytes("ISO-8859-1"),"UTF-8");//
针对于
get
提交时中⽂乱码
示例
: String s=new String(request.getParameter("key").getBytes("ISO-8859-1"),"GBK");
⽅式
3
:修改
tomcat
中配置⽂件
://
使⽤于
get
提交
在
Tomcat
⽬录结构
\conf\server.xml
中设置字符集
![](https://i-blog.csdnimg.cn/blog_migrate/aad29add515220cd384919b031480bf1.png)
注意
:tomcat8.0
以后不需要⼿动设置这个属性了
补充3:get和post的区别
1
、
GET
请求,请求的数据会附加在
URL
之后,以
?
分割
URL
和传输数据,多个参数⽤
&
连接。
URL
的编码格式采⽤的是ASCII
编码,⽽不是
uniclde
,即是说所有的⾮
ASCII
字符都要编码之后再传输。
POST
请求:
POST
请求会把请求的数据放置在
HTTP
请求包的包体中。上⾯的
item=bandsaw
就是实际的传输数据。因此,GET
请求的数据会暴露在地址栏中,⽽
POST
请求则不会。
2
、
传输数据的⼤⼩
在
HTTP
规范中,没有对
URL
的⻓度和传输的数据⼤⼩进⾏限制。但是在实际开发过程中,对于
GET
,特 定的浏览器和服务器对URL
的⻓度有限制。因此,在使⽤
GET
请求时,传输数据会受到
URL
⻓度的限制。
对于
POST
,由于不是
URL
传值,理论上是不会受限制的,但是实际上各个服务器会规定对
POST
提交数据⼤⼩进⾏限制,Apache
、
IIS
都有各⾃的配置。
3
、
安全性
POST
的安全性⽐
GET
的⾼。这⾥的安全是指真正的安全,⽽不同于上⾯
GET
提到的安全⽅法中的安全, 上⾯提到的安全仅仅是不修改服务器的数据。⽐如,在进⾏登录操作,通过GET
请求,⽤户名和密码都会暴露再URL
上,因为登录⻚⾯有可能被浏览器缓存以及其他⼈查看浏览器的历史记录的原因,此时的⽤户名和密码就很容易被他⼈拿到了。除此之外,GET
请求提交的数据还可能会造成
Cross-site request frogery攻击
响应Response
在
Service API
中,定义了⼀个
HttpServletResponse
接⼝,它继承⾃
ServletResponse
接⼝,
专⻔⽤来封 装HTTP响应消息
。
在
HttpServletResponse
接⼝中定义了向客户端发送
响应状态码,响应消息头,响应消息体
的⽅法。
常⽤4个⽅法:
void
addCookie
(Cookie var1);//
给这个响应添加⼀个
cookie
void
sendRedirect
(String var1) ;//
发送⼀条响应码,将浏览器跳转到指定的位置
PrintWriter
getWriter
()
获得字符流,通过字符流的
write(String s)
⽅法可以将字符串设置到
response缓冲区中,随后Tomcat会将
response
缓冲区中的内容组装成
Http
响应返回给浏览器端。
setContentType()
设置响应给客户端的内容的类型比如是文档类型text/html
演示:
先导入javaee-api-7.0.jar
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>1.这是第一个javaweb项目</h1>
<a href="test">test first servlet</a>
<form action="test" method="post">
<input type="submit" value="post-test">
</form>
<h1>2.测试request</h1>
<!--get方式请求-->
<a href="testrequest?upass=abc&uname=李四">test-request-get</a>
<!--post方式请求-->
<form action="testrequest" method="post">
uname:<input type="text" name="username">
upass:<input type="text" name="userpass">
hobby:<input type="checkbox" name="hobby" value="music">音乐
<input type="checkbox" name="hobby" value="run">跑步
<input type="checkbox" name="hobby" value="film">电影
<input type="submit" value="提交">
</form>
</body>
</html>
web.xml进行映射
<?xml version="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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>first servlet</servlet-name>
<!--servlet全类名,这个servlet与下面路径进行映射,通过下面页面路径访问这个servlet-->
<servlet-class>web.TestServlet</servlet-class>
</servlet>
<!--servlet映射-->
<servlet-mapping>
<servlet-name>first servlet</servlet-name>
<url-pattern>/test</url-pattern><!--页面的请求地址-->
</servlet-mapping>
<servlet>
<servlet-name>test request</servlet-name>
<!--servlet全类名,这个servlet与下面路径进行映射,通过下面页面路径访问这个servlet-->
<servlet-class>web.UserServlet</servlet-class>
</servlet>
<!--servlet映射-->
<servlet-mapping>
<servlet-name>test request</servlet-name>
<url-pattern>/testrequest</url-pattern><!--页面的请求地址-->
</servlet-mapping>
</web-app>
UserServlet.java处理请求
package web;
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.io.PrintWriter;
public class UserServlet extends HttpServlet {
//注:服务器在接收数据时使⽤字符串统⼀接收
@Override//接收get请求:超链接
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//tomcat8以后get请求不需要处理乱码问题
//getParameter方法接收用户传递过来的参数,参数已经被封装到req对象中
String uname = req.getParameter("uname");
String upass = req.getParameter("upass");
System.out.println("通过超链接的get请求方式获取到"+"uname:"+uname+",upass:"+upass);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post请求的乱码
req.setCharacterEncoding("utf-8");
//getParameter方法接收用户传递过来的参数,通过键找值,input中的键就是name,参数已经被封装到req对象中
String username = req.getParameter("username");
String userpass = req.getParameter("userpass");
//getParameterValues获取表单组件对应多个值,比如这个复选框
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.print(hobby+" ");
}
//前台通过超链接或表单给后台数据:后台通过req.getParameter()获取
//后台通过req.setAttribute("key",value)给前台数据:在跳转页面通过req.getAttribute("key")获取数据传给前台
//存值取值成对出现。
//request存值范围 :是单次请求有效,也就是一个来回的请求和响应期间这个值有效。
req.setAttribute("username",username);
req.setAttribute("userpass",userpass);
Object usename = req.getAttribute("usename");
Object userpass1 = req.getAttribute("userpass");
System.out.println("通过表单的post请求方式获取到"+"username:"+username+"userpass:"+userpass);
//响应:服务器给客户端信息
resp.setContentType("text/html");//设置响应给客户端的内容的类型比如是文档类型text/html
//resp.addCookie();设置cookie值存储
PrintWriter writer = resp.getWriter();//获取一个给前端输出信息的输出流对象
//处理完数据,跳转页面到success.html,这里使用的是req的转发跳转页面 ,/表示从web目录下
//转发跳转到新页面后,地址栏地址还是之前的地址http://localhost:8080/testrequest
//req.getRequestDispatcher("/success.html").forward(req,resp);
//这个是resp的重定向跳转页面,地址栏地址发生变化http://localhost:8080/success.html
resp.sendRedirect("/success.html");
}
}
转发跳转到新页面后,地址栏地址还是之前的地址http://localhost:8080/testrequest
![](https://i-blog.csdnimg.cn/blog_migrate/41183e7e8adea3d3d0df8b3aea0b0527.png)
这个是resp的重定向跳转页面,地址栏地址发生变化http://localhost:8080/success.html
![](https://i-blog.csdnimg.cn/blog_migrate/069c1c2c2c2ac976294e81b6327756c6.png)
跳转页面两种方式(转发与重定向)
重定向和转发的对⽐
![](https://i-blog.csdnimg.cn/blog_migrate/4d83767466f6083ebffbb9d4a29c9a89.png)
重定向:response.sendRedirect()
转发:request.getRequestDispatcher("../success.jsp").forward(request,response);
相同点:都⽤来跳转⻚⾯
不同点
:
重定向时地址栏会改变
,request
中存储的数据会丢失
.
转发时地址栏显示的是请求⻚⾯的地址,request
数据可以保存。
转发属于⼀次请求⼀次响应
,
重定向属于两次请求
(
地址栏修改了两次
)
两次响应。
补充
:
使⽤
out
对象往⻚⾯中输出
js
或
html,css
out.print("<script type='text/javascript'>alert('登录失
败');location='../login.jsp'</script>");
注
:
使⽤
js
跳转⻚⾯,也会丢失
request
中的数据