Response和Request
一.HttpServletResponse常见应用
Response:Response代表响应,响应消息中的状态码、响应头、实体内容都可以由它进行操作
1.Response输出数据到客户端
response.setContentType("text/html;charset=utf-8") ···解决中文乱码
response.getOutputStream().write(···);
response.getWriter.wtite(···);
Tip:
对于一次请求,Response的getOutputStream方法和getWriter方法是互斥,只能调用其一,特别注意forward后也不要违反这一规则
2.Response设置content-disposition头实现文件下载
response.setHeader("Content-Disposition","attachment;filename=1.jpg"/"attachment;filename="+URLEncoder.encode("图片.jpg", "utf-8")···将下载文件名改为中文);
response.setHeader("Content-Disposition",
InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
OutputStream out = response.getOutputStream();
byte[]bs = new byte[1024];
int i = 0;
while((i=in.read(bs))!=-1){
out.write(bs,0,i);
}
in.close();
//将下载后的文件名改为中文
response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("图片.jpg", "utf-8"));
response.setHeader("Content-Disposition",
InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
OutputStream out = response.getOutputStream();
byte[]bs = new byte[1024];
int i = 0;
while((i=in.read(bs))!=-1){
out.write(bs,0,i);
}
in.close();
3.Response设置refresh头控制定时刷新
1)指定多少秒后刷新当前页面
response.getWriter().write(new Date().toLocaleString());
response.setHeader("Refresh", "1");
2)实现注册后“注册成功,3秒后跳转到主页”的功能
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("恭喜您注册成功!3秒后回到主页.....");
response.setHeader("refresh", "3;url=/Day04/index.jsp");
3)在HTML可以利用<meta http-equiv= "" content="">标签模拟响应头的功能
<html>
<head>
<meta http-equiv="Refresh" content="3;url=/Day04/index.jsp">
</head>
<body>
恭喜您注册成功!3秒后回到主页......
</body>
</html>
4.控制是否缓存资源
1)不缓存,直接刷新,多用在表示当前时间(三行代码都要写)
response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
2)控制缓存时间(System.currentTimeMillis()表示当前时间)
response.setDateHeader("Expires", System.currentTimeMillis()+想缓存的时间);
Tip:
如果想缓存的时间超出int的范围,可转化为long型来计算,如:“1000*3600*24*30”
超出了int的范围,所以需要写成“1000l*3600*24*30”
。
5.请求重定向
response.sendRedirect("地址");
6.实现验证码
实现验证码(https://segmentfault.com/a/11...
二.HttpServletRequest常见应用
Request:Request代表请求对象,其中封装了对请求中具有请求行、请求头、实体内容的操作的方法
1.获取客户机信息
1)获取客户端请求的完整URL
String url = request.getRequestURL().toString();
System.out.println(url);
2)获取客户端请求的资源部分的名称
String uri = request.getRequestURI();
System.out.println(uri);
3)获取请求行中参数部分
String qStr = request.getQueryString();
System.out.println(qSt):
4)获取请求客户端的ip地址
String ip = request.getRemoteAddr();
System.out.println(ip);
5)获取客户机的请求方式
String method = request.getMethod();
System.out.println(method);
6)获取当前web应用的名称(需要web应用名称时用 request.getContextPath()表示,以防web应用名称有变化)
String name = request.getContextPath();
System.out.println(name);
2.获取请求头信息
//获取某个请求头的方法
String value = request.getHeader("某个请求头");
System.out.println(value);
//获取所有请求头的方法
Enumeration<String> enumeration = request.getHeaderNames();
while(enumeration.hasMoreElements()){
String name = enumeration.nextElement();
String value = request.getHeader(name);
System.out.println(name+":"+value);
}
获得具体类型客户机请求头
getIntHeader(name)方法 --- int
getDateHeader(name)方法 --- long(日期对应毫秒)
实例:防盗链制作(https://segmentfault.com/a/11...
3.获取请求参数
getParameter(name) --- String 通过name获得值
getParameterValues --- String[ ] 通过name获得多值 checkbox
getParameterNames --- Enumeration<String> 获得所有name
getParameterMap --- Map<String,String[ ]> key :name value: 多值
使用的HTML文件:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>POST提交</h1><hr>
<form action="/Day04/servlet/ParamServlet" method="POST">
姓名:<input type="text" name="username"/>
地址:<input type="text" name="addr"/>
<input type="submit" value="提交" />
</form>
<h1>GET提交</h1><hr>
<form action="/Day04/servlet/ParamServlet" method="GET">
姓名:<input type="text" name="username"/>
地址:<input type="text" name="addr"/>
<input type="submit" value="提交" />
</form>
</body>
</html>
//获取客户端提交的usename的值
String username = request.getParameter("username");
System.out.println(username);
//遍历所有的请求参数并打印出来
Enumeration<String> enumeration = request.getParameterNames();
while(enumeration.hasMoreElements()){
String name = enumeration.nextElement();
String value = request.getParameter(name);
System.out.println(name+":"+value);
}
Tips:
如果提交内容有中文从而导致乱码:
对于POST提交,可以设置request.setCharacterEncoding("utf-8")来可以解决乱码
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
对于GET提交的乱码,只能手动的进行编解码从而解决乱码问题
String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"utf-8");
System.out.println(username);
4.利用请求域传递对象
作用范围:整个请求链上
生命周期:当服务器收到一个请求,创建出代表请求的request对象,request开始。当请求结束,服务器销毁代表请求的request对象,request域结束.
作用:在整个请求链范围内共享数据,通常我们在Servlet中处理好的数据会存入request域后请求转发到jsp页面来进行展示
Demo3:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setAttribute("banana", "yellow banana");
this.getServletContext().getRequestDispatcher("/servlet/Demo4").forward(request, response);
Demo4:
String value = (String)request.getAttribute("banana");
System.out.println(value);
浏览器访问Demo3,然后Eclipse打印的结果为:
yellow banana
5.实现请求转发和请求包含
(1)请求转发:
request.getRequestDispatcher("").forward(request,response);
Demo5:
request.getRequestDispatcher("/servlet/Demo6").forward(request, response);
Demo6:
response.getWriter().write("from demo6....");
访问Demo5,浏览器上打印结果:
from demo6
Tip:
1)一个Servlet里两次请求转发也是不可以的,一次请求交给两人处理自然也是不行
2)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
(2)请求包含:将两个资源的输出进行合并后输出
request.getRequestDispatcher("").include(request,response);
Demo7:
response.getWriter().write("from demo7"); request.getRequestDispatcher("/servlet/Demo8").include(request, response);
Demo8:
response.getWriter().write("from demo8");
访问Demo7,浏览器上打印结果:
from demo7from demo8
Tip:
被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略
三.Web应用中路径的写法
概念:
1.绝对路径:以/开头的路径就叫做绝对路径,绝对路径在相对于的路径上直接拼接得到最终的路径。
2.相对路径:不以/开头的路径就叫做相对路径,相对路径基于当前所在的路径计算的到最终的路径。
虚拟路径: --写虚拟路径时都使用绝对路径
1)如果路径是给浏览器用的,这个路径相对于虚拟主机,所以需要写上web应用的名称(最好用request.getContextPath()代替,以免web名称有变化)。(前四个)
2)如果路径是个服务器用的,这个路径相对于web应用,所以可以省写web应用的名称。
<a href="/Day04/.....">
<form action="/Day04/...">
<img src="/Day04/...."> response.setHeader("refresh","3;url=/Day04/...");
response.sendRedirect("/Day04/...");
request.getRequestDispathce("/index.jsp").forward():
request.getRequestDispathce("/index.jsp").include();
真实路径: --写真实路径时都使用相对路径
根据原理,具体问题具体分析
servletContext.getRealPath("config.properties");//--给一个相对于web应用目录的路径
classLoader.getResource("../../config.properties");//--给一个相对于类加载目录的路径
File file = new File("config.properties");//--相对于程序的启动目录
new InputStream("config.properties");//--相对于程序的启动目录
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。