JavaWeb---Servlet的请求和响应
Request 和Response 对象都是由服务器创建,管理,销毁. 由我们来使用.
继承体系结构:
ServletRequest(接口)<--------继承<-------HttpServletRequest(接口)<--------实现 [email protected]
ServletResponse(接口)<---------继承--- HttpServletResponse(接口)<-------------实现[email protected]
1.请求对象:获取请求的消息
1)为了防止编码格式的错误,首先应该设置请求编码和响应编码.
//设置请求编码和响应编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
2)/获取请求头
String name = request.getHeader("username");//获取请求头的值
long date = request.getDateHeader(name);//获取日期头
int i = request.getIntHeader(name);//获取数字头
3)获取请求行
String method = request.getMethod();//获取请求的方式:get/post
String uri = request.getRequestURI();//获取Uri
StringBuffer url = request.getRequestURL();//获取URL
String addr = request.getRemoteAddr();//获取IP地址
String queryString = request.getQueryString();//获取请求的参数
String protocol = request.getProtocol();//获取访问的版本,浏览器的信息
4)获取请求体:封装post请求的请求参数//获取请求体:封装post请求的请求参数
BufferedReader reader = request.getReader();
String line = reader.readLine();
5)获取请求的参数
//获取请求参数的不同方式
String na = request.getParameter("username");//通过参数名称获取值
String[] strings = request.getParameterValues("hobby");//通常用于复选框
Map<String,String[]> map = request.getParameterMap();
//遍历map集合
Set<String> keySet = map.keySet();
for(String key:keySet){
System.out.println(key);//遍历参数名
String[] ss = map.get(key);//获取参数的值
for(String v:ss){
System.out.println(key+"="+v);
}
}
Enumeration names = request.getParameterNames();//通过枚举的方式获取
6)中文乱码的解决:post请求
//处理post请求中文乱码的问题
String n = request.getParameter("name");//服务器使用ISO-8859-1 的方式解码
byte[] bys = n.getBytes("ISO-8859-1");
n = new String(bys,"utf-8");
7)重定向和请求转发
重定向特点:两次请求,两次转发;既可以访问内部资源,也可以访问外部资源,地址栏内的地址发生变化
请求转发:一次请求,一次响应;只可以访问项目内部的资源;地址栏的地址不发生改变.
//重定向
//1.设置302状态
response.setStatus(302);
response.setHeader("location", "http:baidu.com");
//重定向:合二为一
response.sendRedirect("http:baidu.com");
//请求转发
request.getRequestDispatcher("/demo1").forward(request, response);
重定向和请求转发的区别:
1.一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。
2.一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
3.RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
4.HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
5.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
2.响应对象:封装响应的数据,当真正的响应之前,取出里面的数据,给浏览器响应.
1)为了防止编码格式的错误,首先应该设置请求编码和响应编码.
//设置请求编码和响应编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
2)响应字符串:
//响应一个字符串'
PrintWriter writer = response.getWriter();
writer.write("正在请求");
3)响应一个图片
//响应一个图片
String path = this.getServletContext().getRealPath("xxx.jpg");//获取图片的真是路径
//读取文件
FileInputStream fis=new FileInputStream(new File(path));
//获取要读的文件
ServletOutputStream fos = response.getOutputStream();
byte[] by=new byte[1024];
int len=0;
while((len=fis.read(by))!=-1){
fos.write(by,0,len);
fos.flush();
}
//关闭资源
fis.close();
fos.close();
推荐阅读
-
Android HTTP发送请求和接收响应的实例代码
-
python通过get,post方式发送http请求和接收http响应的方法
-
Android HTTP发送请求和接收响应的实例代码
-
.net core 杂记:WebAPI的XML请求和响应
-
.net core webapi通过中间件获取请求和响应内容的方法
-
浅谈ajax在jquery中的请求和servlet中的响应
-
angular 用拦截器统一处理http请求和响应的方法
-
Spring 处理请求和响应相关的注解
-
PHP开发微信公众号,你的服务器没有正确响应Token验证,请阅读消息接口使用指南
-
微信自定义菜单报错:存在还未设置响应动作的菜单,请检查