您的位置:首页 > 产品设计 > UI/UE

java自学之路-----servlet_response、request

2014-11-13 20:09 513 查看
Web服务器收到客户端的http请求,会为每次请求分别创建一个request和response对象。想要获取客户端提交的数据只需要使用request对象;想要向客户端输出数据就需要使用response对象。

Response{

将数据写到页面{

通过字节流

<pre name="code" class="java">//		设置响应头,告诉浏览器响应回送的数据类型,Content要大写开头,否则会提示下载
response.setHeader("Content-type", "text/html;charset=UTF-8");
//		获得将数据写到页面的字节流对象
OutputStream out = response.getOutputStream();

//		使用meta标签模拟一个响应头,告诉浏览器以什么形式打开数据
//		out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());

//		使用write方法,将数据写出。需要将数据转换为字节
out.write("中国".getBytes("UTF-8"));//指定码表


通过字符流

//		如果不指定response的码表就会出现乱码。因为数据是先写到response数据中。
//		再从response转成字节写到页面
response.setCharacterEncoding("GB2312");//指定response的码表
response.setHeader("Content-type", "text/html;charset=GB2312");//指定浏览器以什么码表打开
//		获得字符流
PrintWriter out = response.getWriter();

out.write("中国");


注意:

1.getOutputStream和getWriter分别得到用于输出二进制数据和字符的ServletOutputStream和PrintStream对象

2.getOutputStream和getWriter两个方法是互斥的,调用其中一个方法就不能调用另一个方法,否则会抛出IllegalStateException:...has been called for thisresponse

3.Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将会被Servlet引擎(web服务器)从response获取。然后将这些数据和响应消息组合输出到客户端

4.Servlet的service方法结束后,Servlet引擎(web服务器)将检查返回的输出流对象是否已经调用过close方法,如果没有Servlet引擎(web服务器)会调用close方法,进行关闭流对象

}

以下载的方式显示数据

//		1.获得文件在服务器的位置
String filepath = this.getServletContext().getRealPath("/download/1.jpg");

//		2.获得该文件名
String filename = filepath.substring(filepath.lastIndexOf("\\")+1);

//		3.控制浏览器以下载模式打开数据.如果文件名是中文乱码,就需要进行url编码
response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));

//		4.设置读取流,获取输出流。边读边写。写到浏览器
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(filepath);
out = response.getOutputStream();
int len = 0;
byte buffer[] = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
} finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


自动刷新

//		如果想要使用jsp页面进行显示数据。可以通过转发技术,然后将自动刷新定义在模拟头内<meta>
//		设置刷新头
response.setHeader("Refresh", "3;url='/web/index.jsp'");

//		修改码表
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "text/html;charset=UTF-8");

response.getWriter().write("3秒后自动刷新到另一个网页");


response的请求重定向:一个web资源收到客户端的请求后,通知客户端去访问另一个web资源

特点:用户登陆和显示购物车(转发的话,刷新一次就执行一次刚刚的操作)会使用重定向技术

1.浏览器会向web发送两次请求。意味着有两次response和request

2.用重定向技术地址栏会改变

/*//		使用响应头来实现,设置状态码和location
response.setStatus(302);
response.setHeader("location", "/web/index.jsp");		*/

//		使用重定向来实现,
response.sendRedirect("/web/index.jsp");


}

uri(通用资源标识符):/news/1.html,标识某一个资源

url(统一资源定位器):http://www.baidu.com/news/1.html,标识互联网上的一个资源,是uri的孩子。

request{

常用方法:

获得客户机信息 

getRequestURL方法返回客户端发出请求时的完整URL。

getRequestURI方法返回请求行中的资源名部分。

getQueryString 方法返回请求行中的参数部分。

getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

getRemoteAddr方法返回发出请求的客户机的IP地址

getRemoteHost方法返回发出请求的客户机的完整主机名

getRemotePort方法返回客户机所使用的网络端口号

getLocalAddr方法返回WEB服务器的IP地址。

getLocalName方法返回WEB服务器的主机名

获得客户机请求头

getHeader方法

getHeaders方法

getHeaderNames方法

获得客户机请求参数(客户端提交的数据),获取值的时候先检查值是否为空

getParameter方法

getParameterValues(String name)方法

getParameterNames方法

getParameterMap方法

解决浏览器提交数据的乱码问题:(浏览器以什么码表打开就是用什么码表提交数据)

//		只能解决post提交方式的乱码问题
request.setCharacterEncoding("UTF-8
4000
");

String value = request.getParameter("username");

//		解决get提交方式的乱码问题(还有几种方式修改配置文件,查看tomcat文档,不建议使用)
String value = request.getParameter("username");
value = new String(value.getBytes("iso8859-1"),"UTF-8");


转发:

request对象实现请求转发,指一个web资源收到客户端的请求后,通知服务器区调用另一个web资源

//		通过request域(1.容器 2.作用范围)来进行请求转发传递数据
String data = "aaaa";
//		将数据封装到request中
request.setAttribute("data", data);
//		将request转发给message。jsp
request.getRequestDispatcher("/message.jsp").forward(request, response);

注意:

1.forward方法用于将请求封装转发到RequestDispatcher对象封装的资源

2.如果在调用forward的方法之前,在Servlet程序中已经将部分内容发送给客户端,那么forward的方法就会抛出一个IllegalStateException异常。(在forward之前调用了输出流写数据或者有可能是之前也调用了一次forward程序没有停止方法)即:

OutputStream out = response.getOutputStream();
out.write("aaa".getBytes());
//		将流关闭就以为这数据写到了客户端
out.close();
//		第一次forward
request.getRequestDispatcher("/message.jsp").forward(request, response);
//		第二次forward
request.getRequestDispatcher("/message.jsp").forward(request, response);


3.如果在调用forward的方法之前,向request写入内容,只要写入的内容还没真正输出到客户端(这些资源都是先写到response对象中,等到服务器执行完service方法之后才会将缓冲中的数据写到浏览器中,因为执行完之后才会关闭流对象),forward方法就可以被正常执行,原来写到缓冲区(response)的内容将被清空。但已写入HttpServletResponse对象中的响应头字段信息保持有效。

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java