java servlet3_JavaWeb之Servlet(3)

Servlet(3)

HttpServletRequest

该类的对象封装了所以客户端提交过来的数据

获取所有请求头数据

public java.util.Enumeration getHeaderNames()

返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。

实例

Enumeration heards = request.getHeaderNames();

while (heards.hasMoreElements()) {

String heard = (String) heards.nextElement();

String value = request.getHeader(heard);

System.out.println(heard + "=" + value);

}

输出

accept=image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*

referer=http://localhost:8080/HttpservletrequestDemo/login.html

accept-language=zh-CN

ua-cpu=AMD64

accept-encoding=gzip, deflate

user-agent=Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko

host=localhost:8080

connection=Keep-Alive

获取客户端提交过来的数据

1.通过对应name得到值

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

String password = request.getParameter("password");

System.out.println(username + "==" +password);

2.通过request.getParameterMap()得到一个所有数据的map集合,再从中提取数据

Map map = request.getParameterMap();

Set keySet = map.keySet();

System.out.println(keySet.size());

Iterator it = keySet.iterator();

while (it.hasNext()) {

String key = (String) it.next();

String[] values = map.get(key);

System.out.println(key);

for(int i =0;i

System.out.println(key + "=" + values[i]);

}

}

请求中中文乱码问题

即由客户端(浏览器)提交给服务器端的数据,如果带有中文则会出现乱码问题。可通过以下方法解决

对于get请求

1.代码转码

get请求过来的数据,会拼接到url地址栏,所以在url地址栏上就已经经过编码了,所以我们取到的就是乱码,tomcat收到了这批数据。而getParameter 默认使用ISO-8859-1去解码。

解决方法:先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串

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

String password = request.getParameter("password");

username = new String(username.getBytes("ISO-8859-1") , "UTF-8");

System.out.println("userName="+username+"==password="+password);

2.直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。

可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding=“utf-8”

对于post请求

对于post请求来说,该请求的所有数据都在 请求体中,所以直接设置请求体中的文字编码。

request.setCharacterEncoding("utf-8");

这行设置一定要写在getParameter之前。

HttpServletResponse

负责返回数据给客户端

输出数据到页面

//以字符流的方式写数据

//response.getWriter().write("

hello response...

");

//以字节流的方式写数据

response.getOutputStream().write("hello response2222...".getBytes());

解决数据中的中文乱码问题

以字符流输出

解决方式:

response.getWriter()

//1. 指定输出到客户端的时候,这些文字使用UTF-8编码

response.setCharacterEncoding("UTF-8");

response.getWriter().write("人间不值得...");

//2. 直接规定浏览器看这份数据的时候,使用什么编码来看。

response.setHeader("Content-Type", "text/html; charset=UTF-8");

response.getWriter().write("人间不值得...");

以字节流输出

response.getOutputStream()

指定浏览器看这份数据使用的码表

response.setHeader("Content-Type", "text/html;charset=UTF-8");

指定输出的中文用的码表,也可以不指定因为String的getBytes()方法的默认编码格式为utf-8

response.getOutputStream().write("人间不值得..".getBytes("UTF-8"));

不管是字节流还是字符流,直接使用一行代码就可以了。

response.setContentType("text/html;charset=UTF-8");

然后在后面进行写入数据即可。

实现简单的资源下载

1.先写一个简单的index.html

Insert title here

让tomcat的默认servlet提供下载:

aa.jpg

bb.txt

cc.rar

手动下载:

aa.jpg

bb.txt

cc.rar

2.然后再写一个servlet实现浏览器下载

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* Servlet implementation class t1

*/

public class t1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//通过request.getParameter("filename")得到要下载文件名称

String filename = request.getParameter("filename");

System.out.println(filename);

//设置头信息,实现在浏览器下载文件

response.setHeader("Content-Disposition", "attachment; filename="+filename);

//getServletContext().getResourceAsStream("download/"+filename)得到文件的流对象

InputStream is = getServletContext().getResourceAsStream("download/"+filename);

ServletOutputStream os = response.getOutputStream();

int len=0;

byte[] b = new byte[1024];

//实现数据的写入

while((len=is.read(b))!=-1) {

os.write(b,0,len);

}

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

实现中文名称文件下载

针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE、Chrome … 使用的是URLEncoder

1.html页面编写,和上面区别不大

让tomcat的默认servlet提供下载:

aa.jpg

bb.txt

cc.rar

手动下载:

aa.jpg

bb.txt

cc.rar

黑马.png

2.servlet代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String name = request.getParameter("filename");

String filename = new String(name.getBytes("ISO-8859-1"),"utf-8");

System.out.println(filename);

//这一步获取流对象提到编码之前,因为想要下载中文名称文件,那么在设置请求头时文件名必须要针对浏览器类型,对文件名字做编码处理。而在处理后文件名就不能找到对应文件

InputStream is = getServletContext().getResourceAsStream("download/"+filename);

//对浏览器类型,对文件名字做编码处理,此处为针对chrome做的处理。

filename = URLEncoder.encode(filename,"UTF-8");

response.setHeader("Content-Disposition", "attachment; filename="+filename);

ServletOutputStream os = response.getOutputStream();

int len=0;

byte[] b = new byte[1024];

while((len=is.read(b))!=-1) {

os.write(b,0,len);

}

}

请求转发和重定向

之前的写法

response.setStatus(302);

response.setHeader("Location", "login_success.html");

重定向

//重定向写法: 重新定位方向 参数即跳转的位置

response.sendRedirect("login_success.html");

地址上显示的是最后的那个资源的路径地址

请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。

可以跳转到任意路径。 不是自己的工程也可以跳。

效率稍微低一点, 执行两次请求。

后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。

请求转发

//请求转发的写法: 参数即跳转的位置

request.getRequestDispatcher("login_success.html").forward(request, response);

地址上显示的是请求servlet的地址。 返回200 ok

请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。

只能跳转自己项目的资源路径 。

效率上稍微高一点,因为只执行一次请求。

可以使用上一次的request对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.org.servlet3; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; /** * @project servlet3.0 * servlet3.0的文件上传 * @date:2012-5-21 *在创建项目的时候首先添加Tomcat7.x的支持,然后把apache-tomcat-7.0.27\conf\web.xml拷贝到项目WEB-INF目录下 *把之前的web.xml覆盖.. 配置留下 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> */ @SuppressWarnings("all") @WebServlet(name="fileUploadServlet",urlPatterns="/fileUploadServlet") @MultipartConfig(maxRequestSize=222222)//设置文件上传大小 public class FileUploadServlet extends HttpServlet { /** *访问 *http://localhost:8080/servlet3.0/ */ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); Part part=req.getPart("file"); //获取页面的name //System.out.println(part.getName()); System.out.println(System.getProperty("user.dir"));//输出当前的项目存放的路径 String uploadPath=req.getSession().getServletContext().getRealPath("/upload"); System.out.println(uploadPath);//输出上传的文件路径 String value=part.getHeader("content-disposition");//设置头信息 System.out.println(value); String sub=value.substring(value.lastIndexOf("=")+2,value.length()-1);//截取文件 System.out.println("file size: \t"+part.getSize());//文件的大小 part.write(uploadPath+sub);//写入文件 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值