Servlet(11)HttpServletResponse、HttpServletRequest详解及中文乱码处理

web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即代表请求和响应。我们要获取客户机提交的数据,只需要找request对象就行了;要向客户机发送数据,只需要找response对象就行了。

1 HttpServletResponse


getWriter():向客户端回送字符数据
getOutputStream():回送字符数据和字节数据(二进制)
同一个Response对象中,这两个流不能同时使用, 一个流发送数据后,response就会关闭。
②sendRedirect()使用

// --------------页面跳转传值实现---------------------
// 放在url中
response.sendRedirect("/UserManager/MainFrame?uname="+username+"&password=" + password);
//  -----MainFrame页面取值--------
// 获取登录名
String username = request.getParameter("uname");
String pwd = request.getParameter("password");
out.println("<h1>hello " +  username + " " + pwd +  " 主界面!</h1>");

③使用session传递数据(session可以传递对象)

// 使用session来传递数据给下个页面
request.getSession().setAttribute("loginUser", username);
// ---------------------取出数据 ------------------
String user2 = (String) request.getSession().getAttribute("loginUser");

④小结
通过HttpServletResponse回送的http头,可以控制浏览器的行为;通过HttpServletResponse提供的函数,可以完成相应的功能(比如下载文件,生成随机验证码)。

2 HttpServletRequest

该对象表示浏览器的请求,当web服务器得到该请求后,会把请求信息封装到该对象中。
①通过HttpServletRequest获取客户机信息
这里写图片描述

// 链接: http://127.0.0.1:8080/UserManager/MainFrame?username=jiaozl&password=123
// URL  http://127.0.0.1:8080/UserManager/MainFrame
String url = request.getRequestURL().toString();
// URI  /UserManager/MainFrame
String uri = request.getRequestURI();
// QueryString  username=jiaozl&password=123
String queryString = request.getQueryString();
// RemoteAddr   127.0.0.1
String remoteaddr = request.getRemoteAddr();
// RemoteHost   127.0.0.1
String remoteHost = request.getRemoteHost();
// RemotePort(客户机使用的端口) 23191
int remotePort = request.getRemotePort();
// 8080
int serverPort = request.getLocalPort();

②getHeader getHeaderNames

String host = request.getHeader("host");
// ------- 得到所有请求头 -------------
Enumeration<String> er = request.getHeaderNames();
while(er.hasMoreElements()) {
    String header = er.nextElement();
    System.out.println(header + " : " + request.getHeader(header));
}

③获得用户通过表单(或地址栏中参数)提交的内容
常见表单元素,参考: HTML(1)表单中常用控件http://blog.csdn.net/u013943420/article/details/70147220

// 普通表单内容(输入框,文本域,单选框,下拉框-单选状态下)
String u = request.getParameter("username");
String p = request.getParameter("password");
// 得到 复选框、下拉框-多选状态下 的内容
String []hobbies = request.getParameterValues("hobby");

④实现请求转发
请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
HttpServletRequest对象,提供了一个getRequestDispatch方法,该方法返回一个RequestDispatch对象,调用这个对象的forward方法可以实现请求转发。
Request对象同时也是一个域对象,通过Request对象实现转发时,把数据通过Request对象带给其他web资源处理。

// 把参数放入Request域对象中
request.setAttribute("username", username);
request.setAttribute("password", password);
// 使用转发方法,把Request和Response对象传递给下一个servlet
request.getRequestDispatcher("/MainFrame").forward(request, response);
// --------接收端 获取数据-------------------
String username = request.getAttribute("username").toString();
String pwd = request.getAttribute("password").toString();

sendRedirect和forward的区别:
- 叫法不同:sendRedirect重定向,转发; forward叫转向
- 实际发生的位置不同:sendRedirect发生在浏览器;forward发生在web服务器
- 用法不一样:request.getRequestDispatcher(“/资源URI”).forward(req, res); response.sendRedirect(“/web应用/资源URI”);
- 能够去的URL范围不一样:sendRedirect可以去外边URL;forward只能去当前web应用的资源

3 中文乱码处理

①发生中文乱码的三种情况及解决方案
- 表单form(发送端分别采用get、post方式,接收端对应的解决办法)
post:在接收的地方添加request.setCharacterEncoding("utf-8");
get:String name = new String(request.getParameter("username").getBytes("iso-8859-1"), "utf-8");

- 超链接
<a href="http://www.baidu.com?username=用户名">测试</a>
处理方式和get一样
- sendRedirect() 发生乱码
response.sendRedirect(“/servlet?username=用户名”);
处理方式和get一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ADreamClusive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值