JavaWeb之Request/Response代码修炼篇(五)

1. 解决中文字符编码问题

String str = "我爱java";
//第一种方法
response.setContentType("text/html;charset=GBK");(推荐)
//第二种方法
//response.setHeader("Content-Type","text/html;charset=UTF-8");
//第三种方法
//response.getOutputStream().write("<meta http-equiv=‘Content-Type‘ content=‘text/html;charset=UTF-8‘>".getBytes());
response.getOutputStream().write(str.getBytes());

2. Firefox中文文件名下载问题

String path = "/WEB-INF/classes/你好.jpg";
String filename = path.substring(path.lastIndexOf("/")+1);
String absolutePath = getServletContext().getRealPath(path);
if(request.getHeader("User-Agent").contains("Firefox")) {
	response.setHeader("Content-Disposition", "attachment;filename="+encodeDownloadFilename(filename, "Firefox"));
} else {
	response.setHeader("Content-Disposition", "attachment;filename="+encodeDownloadFilename(filename, "ie"));
}
InputStream is = new FileInputStream(absolutePath);
OutputStream os = response.getOutputStream();
int len = -1;
byte buf[] = new byte[1024];
while((len=is.read(buf)) != -1) {
	os.write(buf, 0, len);
}

is.close();

public String encodeDownloadFilename(String filename, String agent) throws IOException {

	if(agent.contains("Firefox")) {
		filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
	} else {
		filename = URLEncoder.encode(filename,"UTF-8");
	}
	return filename;
}

3. 验证码图片

//控制浏览器定时刷新
response.setHeader("refresh", "10");

//定义高度和宽度
int width = 120, height = 25;
//创建一个图像缓冲区
BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//得到画笔
Graphics g = bImage.getGraphics();
//设置画笔颜色画边框,填充背景,画线条,画字符串
g.setColor(Color.BLACK);
g.drawRect(0, 0, width, height);
//填充背景
g.setColor(Color.LIGHT_GRAY);
g.fillRect(1, 1, width-2, height-2);
//画线条
Random r = new Random();
g.setColor(Color.CYAN);
for(int i=0; i<20; i++) {
	g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
}
//字符串,设置字体样式
Font font = new Font("楷体",Font.BOLD|Font.ITALIC, 20);
g.setFont(font);
g.setColor(Color.RED);
String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728";
for(int i=0; i<4; i++) {
	String ch = base.charAt(r.nextInt(base.length())) +"";
	g.drawString(ch, 20+(20*i), 20);
}

//设置头信息显示数据类型
response.setHeader("Content-Type", "image/jpeg");
//清空缓存信息
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");

ImageIO.write(bImage, "jpg", response.getOutputStream());

4. 设置缓存时间

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

response.setDateHeader("Expires", System.currentTimeMillis()+60*60*1000);
PrintWriter out = response.getWriter();
out.write("刘若英-十年");

5.1 获取请求参数方式1

//1. 获取获取请求参数(文本框中的值)
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()) {
	/*String name = new String(names.nextElement().getBytes("ISO-8859-1"),"UTF-8");
	String value = new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");*/
	String name = names.nextElement();
	String value = request.getParameter(name);

	response.getWriter().write(name+":  "+value);
}

5.2 获取请求参数方式2

// 2. 通过反射获取请求参数
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
User user = new User();
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
	String name = names.nextElement();
	String values[] = request.getParameterValues(name);

	Class clazz = user.getClass();
	try {
		Field field = clazz.getDeclaredField(name);
		field.setAccessible(true);
		if (values != null & values.length > 1) {
			field.set(user, (Object) values);
		} else {
			field.set(user, values[0]);
		}
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

response.getWriter().write(user.getUsername() + ">>"+ Arrays.toString(user.getPassword()));

5.3 获取请求参数方式3

// 3. 通过内省完成获取请求参数
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
User user = new User();

Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry : map.entrySet()) {
	String name = entry.getKey();
	String values[] = entry.getValue();
	try {
		PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
		Method m = pd.getWriteMethod();
		if(values!=null && values.length>1) {
			m.invoke(user, (Object)values);
		} else {
			m.invoke(user, values[0]);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}
response.getWriter().write(user.getUsername() + ">>" +Arrays.toString(user.getPassword()));

5.4 获取请求参数方式4

// 4. 通过BeanUtils中setProperty()方法
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
User user = new User();

Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry : map.entrySet()) {
	String name = entry.getKey();
	String values[] = entry.getValue();
	try {
		if(values!=null && values.length>1) {
			BeanUtils.setProperty(user, name, (Object)values);
		} else {
			BeanUtils.setProperty(user, name, values[0]);
		}
	} catch (IllegalAccessException | InvocationTargetException e) {
		e.printStackTrace();
	}
}
response.getWriter().write(user.getUsername() + ">>" + Arrays.toString(user.getPassword()));

5.5 获取请求参数方式5

//		5. 通过BeanUtils中的populator()方法
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
User user = new User();
try {
	BeanUtils.populate(user, request.getParameterMap());
} catch (IllegalAccessException | InvocationTargetException e) {
	e.printStackTrace();
}
response.getWriter().write(user.getUsername() + ">>" + Arrays.toString(user.getPassword()));
时间: 2025-01-11 23:21:22

JavaWeb之Request/Response代码修炼篇(五)的相关文章

JavaWeb之Request &amp;&amp; Response篇

Reuqest 和 Response 服务器处理请求的流程 服务器每次收到请求时,都会为这个请求开辟一个新的线程. 服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!(request中存放着本次请求的所有数据) 服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应.(response中存放着服务器针对本次请求处理的所有数据) 一.request request是Servlet.service()方法的一个参数,类型为ja

test request&amp;&amp;response 代码实现

使用工具 IDEA  创建一个登录页面和后方数据库连接 1.编写login.html文件  导入到web文件夹下 设置配置文件  druid.properties 导入jar包  放置到web文件夹下的WEB-INF中  lib level:Add as  Library 2.创建数据库环境 create database db1; use db1; create table user( id int primary key auto_increment, username varchar(32

Javaweb学习——request&amp;response

request对象的作用 request是服务器对浏览器访问请求的封装 访问请求参数,通过getParameter()方法获取传递参数的值. 在进行转发请求时,需要把一些参数传递到转发后的页面进行处理,这时运用request对象的setAttribute()方法来将参数保存到request对象范围,在运用getAttrbute()方法读取request范围内的变量. 获取cookie,利用request获取cookie对象的集合 获取客户端信息 response对象的作用 response是相应

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别

先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转,然后将结果直接给游览器,这也是问什么游览器会不改变url地址.下面是具体总结他们的区别 一.response.sendRedirect(url)-服务器将新url发送给游览器,游览器再根据新url请求 Request.getRequestDispatcher(url).forward(reques

JavaWeb学习笔记四 request&amp;response

HttpServletResponse 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response.service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大. respon

javaWeb中request请求转发和response重定向

1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的"/uu"则代表相对与WEB应用的路径. 举例: Servlet 和 目标文件的包路径: Servlet  代码:中 doPost 和doGet代码: request 重定向url地址 或者是是相对于 本项目 (WEB13)  http:localhost:8080/WEB13+url     

JSP最常用的五种内置对象(out,request,response,session,application)

为了简化开发过程,JSP提供了一些内置对象,它们由容器实现和管理.开发者在JSP页面中无需声明,无需实例化就可使用.主要有out,request,response,session,application,pageContext,page,config和exception这九个,其中前五个最常用. out out对象为客户打开输出流,向客户端发送输出流.简单来说就是向客户端输出数据. 常用方法: out.print("hello world"); //输出到浏览器 out.print(2

【报文】理解HTTP协议的Request/Response(请求响应)模型

[报文]理解HTTP协议的Request/Response(请求响应)模型 系列目录 [简介]"请求/响应"模型 http://www.cnblogs.com/engraver-lxw/p/7550514.html [原理]理解HTTP协议的Request/Response(请求响应)模型 http://www.cnblogs.com/engraver-lxw/p/7550691.html [报文]理解HTTP协议的Request/Response(请求响应)模型--当前 http:/