HttpServletRequest
请求流程
Request和Response在每一次访问时都被创建。由容器创建。
Servlet只会被创建一次,由用户来开发,由容器来创建,单例。
ServletConfig会为每一个Servlet创建一个Config对象,且由Servlet维护。就是声明成了成员变量。
ServletContext对象,是这一个项目就只有一个对象
SerlvetRequest接口类用于封装请求消息
HttpServletRequest是专用于HTTP协议的ServletRequest子接口,它用于封装HTTP请求消息。
在service()方法内部调用HttpServletRequest对象的各种方法来获取请求消息。
Request功能
- 接收用户的参数
- 接收用户的所有请求头消息
- 转发、包含
- 作为域对象也可以存放数据
getParameter(String)方法根据名字获取一个参数,返回类型为String
// 姓名:<input type="text" user="username" id="username"/>
String name = request.getParameter("username");
getParameterValues(String)方法返回一组相关的数据,返回类型String[]
//getParameterValues(String)方法返回一组相关的数据,返回类型String[]
//参数:就是name属性的值
String[] hobbys = request.getParameterValues("hobby");
for(String a:hobbys){
System.out.println("爱好:"+a);
}
getParameterNames() 获取所有参数的名字,返回类型为:枚举
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name1 = names.nextElement();
System.out.println("每一个参数为:"+name1);
}
getParameterMap()方法 , 获取所有数据,返回类型为Map
接收用户的参数
<form action="oneServlet" method="post">
姓名:<input type="text" name="username" id="username" /> <br>
<input type="checkbox" name="hobby" value="read"/>读书
<input type="checkbox" name="hobby" value="run"/>跑步
<input type="checkbox" name="hobby" value="football"/>踢足球<br>
性别:<input type="radio" name="sex" value="male" />男
<input type="radio" name="sex" value="female" />女<br>
<input type="submit" value="提交"/>
</form>
--------------------------------------------------------------------
//getWiter()方法,把相应结果输入到浏览器
PrintWriter out = response.getWriter();
//解决响应乱码
response.setContentType("text/html;charset=utf-8");
String[] hobbys = request.getParameterValues("hobby");
for(String a:hobbys){
out.write(a);
}
获取参数时的乱码
因为我们请求和响应结果都需要经过tomcat服务器,而tomcat服务器的编码格式为iso-8859-1
解决方案一
**响应乱码**
//第一种方式 可以处理post和get请求
//获取姓名
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
out.write("姓名:"+username);
//第二种方式
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
out.write("姓名:"+username);
//System.out.println("姓名:"+username);
//out.write("姓名:"+username);
请求乱码
//第一种可以处理get和post
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
//把获取的name值(iso-8859-1)转成字节码
byte[] byte1 =username.getBytes("iso-8859-1");
String username1 = new String(byte1,"utf-8");
System.out.println("姓名:" + username);
//第二种
第二种方式可以修改tomcat的server.xml文件,在connctor节点添加userBodyEncodingForURI=“true”,而tomcat8.0以上已经默认处理。8.0以下版本需要手动添加配置,只是针对get请求
** 转发**
定义:是Java给请求在服务器内部交给另一个组件再去执行,同时共享request中的数据
特点:
1、转发是由服务器内部实现的,不会再由浏览器发一个新的请求。
(在最终servlet中,request和中转的request对象是同一个)
2、只能转到当前web资源
3、由于不是一个新的请求,所以地址栏中的地址还是初始请求的地址
4、/代表当前web应用根目录http:…localhost:8080/… –-当前根目录
//ServletA
request.setAttribute("name", "zhangsan");
System.out.println(request.getAttribute("name"));
//请求转发:把请求转发给另一个servlet进行处理
String path = "/testServlet"; //路径
request.getRequestDispatcher(path).forward(request, response);
// ServletB
System.out.println(request.getAttribute("name"));
请求域属性
存储在ServletRequest对象中的属性被称为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据
相关的方法
- setAttribute方法
- getAttribute方法
- removeAttribute方法
- getAttributeNames方法
HttpServletResponse
ServletResponse接口类用于创建响应消息
HttpServletResponse是专用于HTTP协议的,ServletResponse子接口,用于封装HTTP响应消息
Response功能
1.设置响应内容
2.设置响应头
3. 重定向
重定向
重定向特点
地址栏不是初次请求的地址栏,是最后一次响应的地址栏 在最终的servlet中,request和response不是同一个对象
/代表当前web站点的根目录http://localhost:8080/testServlet — 当前站点
可以重定向到外部资源
转发和重定向的区别:
请求只是发了一次请求,重定向发了两次请求