WEB-request&response篇
1.1 案例一:读取WEB工程下的文件.
1.1.1 需求:
现在有一个配置文件在web工程的src下,项目要发布到tomcat中,需要编写一段程序读取文件.
1.1.2 分析:
1.1.2.1 技术分析:
【使用ServletContext对象读取WEB项目下的文件】
* InputStream getResourceAsStream(String path); ---根据提供路径读取文件返回一个文件的输入流.
* String getRealPath(String path); --- 返回一个路径的磁盘绝对路径.
1.1.3 代码实现:
1.1.3.1 使用getResourceAsStream读取
/**
* 使用ServletContext中的getResourceAsStream读取.
* @throws FileNotFoundException
* @throws IOException
*/
privatevoid test2() throws FileNotFoundException, IOException {
// 获得ServletContext:
ServletContext context =this.getServletContext();
InputStream is =context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(is);
String driverClass =properties.getProperty("driverClass");
String url =properties.getProperty("url");
String username = properties.getProperty("username");
String password =properties.getProperty("password");
System.out.println(driverClass);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}
1.1.3.2 使用getRealPath读取文件:
/**
* 使用ServletContext中的getRealPath读取.
* @throws FileNotFoundException
* @throws IOException
*/
privatevoid test3() throws FileNotFoundException, IOException {
// 获得ServletContext:
ServletContext context =this.getServletContext();
String realPath = context.getRealPath("/WEB-INF/classes/db.properties");
// 获得该文件的磁盘绝对路径.
System.out.println(realPath);
InputStream is = newFileInputStream(realPath);
Properties properties = new Properties();
properties.load(is);
String driverClass =properties.getProperty("driverClass");
String url =properties.getProperty("url");
String username =properties.getProperty("username");
String password =properties.getProperty("password");
System.out.println(driverClass);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}
1.1.4 总结:
1.1.4.1 ServletContext的功能:
【功能一:读取全局初始化参数】
【功能二:获得文件的MIME的类型】
【功能三:作为域对象存取数据】
范围:整个web项目.而且全局的对象.
创建:服务器启动的时候,服务器为每个web项目创建一个单独的ServletContext对象.
销毁:服务器关闭的时候销毁ServletContext.
【功能四:读取web项目下的文件】
1.2 案例二:登录成功后,完成文件的下载.
1.2.1 需求:
在登录成功后,页面跳转到文件下载的列表的页面,点击列表中的某些链接,下载文件.
1.2.2 分析:
1.2.2.1 技术分析:
【Response的概述】
Ø Response:代表响应的对象.从服务器向浏览器输出内容.
【Response的常用的API】
Ø 响应行:
* 设置状态码.
Ø 响应头:
* 针对一个key对应多个value的头信息.
* 针对一个key对应一个value的头信息.
Ø 响应体
【文件下载的方式】
Ø 一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持.
Ø 二种:手动编写代码的方式完成文件的下载.
* 设置两个头和一个流:
* Content-Type :文件的MIME的类型.
* Content-Disposition :以下载的形式打开文件.
* InputStream :文件的输入流.
1.2.3 代码实现
1.2.3.1 步骤一:将之前的登录功能准备好:
1.2.3.2 步骤二:在文件下载列表页面上添加文件下载的链接:
1.2.3.3 步骤三:完成文件下载的代码的实现:
public class DownloadServlet extends HttpServlet {
privatestatic final long serialVersionUID = 1L;
protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
// 1.接收参数
String filename =request.getParameter("filename");
// 2.完成文件下载:
// 2.1设置Content-Type头
String type =this.getServletContext().getMimeType(filename);
response.setHeader("Content-Type",type);
// 2.2设置Content-Disposition头
response.setHeader("Content-Disposition","attachment;filename="+filename);
// 2.3设置文件的InputStream.
String realPath =this.getServletContext().getRealPath("/download/"+filename);
InputStream is = newFileInputStream(realPath);
// 获得response的输出流:
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();
}
protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
1.2.3.4 response输出响应内容的方法:
向页面响应的方法:
* getOutputStream();
* getWriter();
* 这两个方法是互斥的.
* 做出响应的时候只能使用其中的一种流响应.
* 输出中文乱码的处理:
* 字节流:
* 设置浏览器默认打开的编码:
* resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置中文字节取出的时候编码.
* “中文”.getBytes(“UTF-8”);
* 字符流:
* 设置浏览器打开的时候的编码
* resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置response的缓冲区的编码
* response.setCharacterEncoding(“UTF-8”);
***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”);
1.3 案例三:完成用户注册的功能:
1.3.1 需求:
网站首页上点击注册的链接,跳转到注册页面,在注册页面中输入信息.完成注册:(将数据保存到数据库中)
1.3.2 分析:
1.3.2.1 技术分析:
【Request的概述】
Ø Request代表用户的请求.
【Request的API】
功能一:获得客户机相关的信息
Ø 获得请求方式:
Ø 获得请求的路径:
Ø 获得客户机相关的信息:
Ø 获得工程名:
功能二:获得从页面中提交的参数:
功能三:作为域对象存取数据:
1.3.3 代码实现:
1.3.3.1 步骤一:创建数据库和表:
1.3.3.2 步骤二:创建包和类:
1.3.3.3 步骤三:引入注册页面:
1.3.3.4 步骤四:注册代码的实现:
1.3.4 总结:
1.3.4.1 处理request接收参数的中文乱码的问题:
现在无论是GET还是POST提交中文的时候,都会出现乱码的问题.
解决:
Ø POST的解决方案:
* POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
* 设置request的缓冲区的编码:
*request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.
Ø GET的解决方案:
* 1.修改tomcat的字符集的编码.(不推荐)
* 2.使用URLEncoder和URLDecoder进行编码和解码的操作.
* 3.使用String的构造方法:
1.3.4.2 Request作为域对象存取数据:
使用request对象存取数据:
* setAttribute(Stringname,String value);
* Object getAttribute(Stringname);
request的作用范围:
* 作用范围就是一次请求的范围.
* 创建和销毁:
* 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
* 销毁:当服务器对这次请求作出了响应之后.
1.3.4.3 重定向和转发的区别:(redirect和forward的区别)
* 1.重定向的地址栏会发生变化,转发的地址栏不变.
* 2.重定向两次请求两次响应,转发一次请求一次响应.
* 3.重定向路径需要加工程名,转发的路径不需要加工程名.
* 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.