requet&response

requet&response


1.1 案例一:完成登录用户对他提供文件的下载的功能.

1.1.1 需求:

之前的案例中已经完成的了一个登录的功能,登录失败后回到登录页面.登录成功以后,服务器提供多个文件的下载的链接,点击链接可以完成文件的下载的功能.

1.1.2 分析:

1.1.2.1 技术分析:

【响应对象-Response对象】

响应行:

Response设置状态码:


响应头:

Response设置响应头:

* 一个key对应一个value


* 一个key对应多个value

响应体:
Response设置响应体:

【乱码】

字节流:

设置浏览器默认打开编码

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

中文转成字节数组编码

response.getOutputStream().write("王守义".getBytes("UTF-8"));

字符流:

设置response的缓冲区的编码

response.setCharacterEncoding("UTF-8");

设置浏览器默认打开的编码.

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

response.setContentType("text/html;charset=UTF-8");相当于上面两句

【文件下载】

一种:超链接方式.(不推荐)

* <a href=”aa.zip”>下载</a>

* <a href=”1.jpg”>下载</a>

二种:手动编码方式完成文件下载.

* 设置两个头和一个流:

* Content-Type:文件MIME的类型.

* Content-Disposition:

* 文件的输入流:

1.1.2.2 步骤分析:

之前的登录案例已经存在:

登录成功跳转的页面上提供一组链接:

当点击下载的链接之后,提交到Servlet:

设置两个头和一个流:

1.1.3 代码实现:

1.在页面中提供一组下载的链接:

response.getWriter().println("<h2>手动编码方式下载</h2>");

response.getWriter().println("<a href='/WEB10/downloadServletfilename=a.bmp'>a.bmp</a><br/>");

response.getWriter().println("<a href='/WEB10/downloadServletfilename=WEB01.zip'>WEB01.zip</a>");

 

2.编写DownloadServlet:

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

/**

* 接收参数:

* 设置两个头和一个流:

* 文件输入流和响应的输出流对接:

*/
// 接收参数:get乱码 new String("中文".getBytes("ISO-8859-1"),"UTF-8");


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

System.out.println(filename);
// 设置两个头和一个流:
// 设置Content-Type头
String fileType = this.getServletContext().getMimeType(filename);
response.setContentType(fileType);
// 设置Content-Disposition:
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 设置文件的输入流:
String path = this.getServletContext().getRealPath("/download/"+filename); // 
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
}

 

【总结】

1.1.4.1 中文文件名下载:

中文文件在不同的浏览器中编码方式不同:

IE :URL编码

Firefox :Base64编码

if(agent.contains("Firefox")){

// 火狐浏览器

filename = base64EncodeFileName(filename);
}else{
// IE,其他浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}

public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=UTF-8B"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

 

reg and login

1.2.1 需求:

在商城的网站上完成一个注册的功能:


1.2.2 分析:

1.2.2.1 技术分析

【请求对象-request对象】

获得客户机信息:

* getMethod(); ---获得请求方式.

* getQueryString(); ---获得请求路径后的参数.

* getRemoteAddr(); ---获得客户机的IP地址.

* getRequestURI(); ---获得请求的路径

* getRequestURL(); ---获得请求的路径

* getContextPath(); ---获得工程名

获得请求头

* request.getHeader(“User-Agent”);

* request.getHeader(“Referer”);

请求参数:

用来作为域对象存取值:


1.2.2.2 步骤分析:

步骤一:设计注册页面:

步骤二:点击页面中的注册的按钮:提交到Servlet中.

步骤三:在Servlet中接收参数:

步骤四:封装实体中.

步骤五:调用业务层.处理数据.

步骤六:根据处理的结果做出响应.
1.2.3 代码实现:
1.创建数据库
create database web10;
use web10;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(20),
name varchar(20),
sex varchar(10),
birthday date,
hobby varchar(50)
);
2.接收参数:
* request.getParameter(String name);
* request.getParameterValues(String name);
* request.getParamaterMap();
3.参数接收中的乱码处理.
POST乱码处理:
* <form method=”post”>的时候,这种提交才是POST提交.其他的都是get.
* POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1.
* 处理方式:设置request的缓冲区的编码.
* request.setCharacterEncoding(“UTF-8”);

GET方式乱码处理:
* GET方式提交的参数会在地址栏上显示 在请求行的路径后面.浏览器就会对路径进行一次编码.将编码后内容取出来.再进行一次编码.
* 处理方式:
* 修改服务器提交的编码.
* 采用URLEncoder 和 URLDecoder类对中文进行编码和解码.
* 使用String类的构造方法:
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username);

4.数据的封装:BeanUtils.(内省技术)
1.2.4 总结:
1.2.4.1 转发和重定向的区别:
【重定向】
response.sendRedirect(String path); -- 完成重定向
【转发】
request.getRequestDispatcher(String path).forward(request,response);
【区别】
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名.重定向的路径需要加工程名.
1.2.4.2 使用转发和重定向对登录的功能优化:
使用request域保存一个值:在一次请求范围内有效的.
登录失败就可以保存一个错误信息到request中在动态页面中取出这个值${msg}

 

 

转载于:https://www.cnblogs.com/java-gwd/p/6474427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值