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