JSP九大隐式对象:
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletcContext
config ServletConfig
exception (特殊情况下使用)
page this(本JSP页面)
out JspWriter(带缓冲的PrintWriter)
pageContext (使普通Java类可访问WEB资源,自定义 标签常用)
四个域对象:
pageContext(称之为page域)
request(称之为request域)
session(称之为session域)
servletContext(称之为application域)
ServletRequest
【使用ServletRequest接收参数】
* String getParameter(String name); ---用于接收一个名称对应一个值的数据.
* String[] getParameterValues(String name);---用于接收一个名称对应多个值的数据.
* Map getParameterMap(); ---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
* Enumeration getParameterNames() ---用于获取表单中提交的所有的参数的名称.
处理request接收参数的中文乱码的问题:
现在无论是GET还是POST提交中文的时候,都会出现乱码的问题.
解决:
- POST的解决方案:
* POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
* 设置request的缓冲区的编码:
* request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.
* POST:request.setCharacterEncoding(“UTF-8”); -- 在接收参数之前设置
- GET的解决方案:
* 1.修改tomcat的字符集的编码.(不推荐)
* 2.使用URLEncoder和URLDecoder进行编码和解码的操作.
* 3.使用String的构造方法:
* GET :new String(name.getBytes("ISO-8859-1"),"UTF-8"); -- 使用String的构造方法 (如果是Tomcat8就不需要处理GET请求乱码了)
【Request的API】
功能一:获得客户机相关的信息
- 获得请求方式:
- 获得请求的路径:
- 获得客户机相关的信息:
- 获得工程名:
功能二:获得从页面中提交的参数:
功能三:作为域对象存取数据:
转发:
request.getRequestDispatcher("").forward(request, response);
Request作为域对象存取数据:
使用request对象存取数据:
* setAttribute(String name,String value);
* Object getAttribute(String name);
request的作用范围:
* 作用范围就是一次请求的范围.
* 创建和销毁:
* 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
* 销毁:当服务器对这次请求作出了响应之后.
重定向和转发的区别:(redirect和forward的区别)
* 1.重定向的地址栏会发生变化,转发的地址栏不变.
* 2.重定向两次请求两次响应,转发一次请求一次响应.
* 3.重定向路径需要加工程名,转发的路径不需要加工程名.
* 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
或者:
response.setStatus(302);
response.setHeader("Refresh", "5;url=/day09_web/CountServlet"); // 可是设置时间多久跳转
//response.setHeader("Location", "/day09_web/CountServlet");// 不可以设置时间
重定向简化的写法:
response.sendRedirect( "/day09_web/CountServlet");
- 在jsp页面中你也会看到通过下面的方式实现转发:
<jsp:forward page="apage.jsp" /> //jsp页面中转发
- 在jsp页面实现重定向
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Refresh" content = "5;url=/day09_web/demo_03-login/index.html"/>
<title>Insert title here</title>
<script type = "text/javascript">
var time = 5;
window.onload = function(){
setInterval('changeTime()',1000);
}
function changeTime(){
time--;
document.getElementById("s1").innerHTML = time
}
</script>
</head>
<body>
<h1>登录成功!!!!</h1>
<h2>页面将在<span id = "s1">5</span>秒后跳转</h2>
</body>
</html>
HttpServletResponse(文件下载)
【Response的概述】
- Response:代表响应的对象.从服务器向浏览器输出内容.
【Response的常用的API】
- 响应行:
* 设置状态码.
- 响应头:
* 针对一个key对应多个value的头信息.
* 针对一个key对应一个value的头信息.
- 响应体
【文件下载的方式】
- 一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持.
- 二种:手动编写代码的方式完成文件的下载.
* 设置两个头和一个流:
* Content-Type :文件的MIME的类型.
* Content-Disposition :以下载的形式打开文件.
* InputStream :文件的输入流.
如:
// 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 = new FileInputStream(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();
中文文件的下载:
- IE浏览器下载中文文件的时候采用的URL的编码.
- Firefox浏览器下载中文文件的时候采用的是Base64的编码.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.接收参数
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
System.out.println(filename);
// 2.完成文件下载:
// 2.1设置Content-Type头
String type = this.getServletContext().getMimeType(filename);
response.setHeader("Content-Type", type);
// 2.3设置文件的InputStream.
String realPath = this.getServletContext().getRealPath("/download/"+filename);
// 根据浏览器的类型处理中文文件的乱码问题:
String agent = request.getHeader("User-Agent");
System.out.println(agent);
if(agent.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename,"UTF-8");
}
// 2.2设置Content-Disposition头
response.setHeader("Content-Disposition", "attachment;filename="+filename);
InputStream is = new FileInputStream(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();
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
response输出响应内容的方法:
向页面响应的方法:
* getOutputStream(); //字节流
* getWriter(); //字符流
* 这两个方法是互斥的.
* 做出响应的时候只能使用其中的一种流响应.
* 输出中文乱码的处理:
* 字节流: response.getOutputStream().write("".getByte())
* 设置浏览器默认打开的编码:
* resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置中文字节取出的时候编码.
* “中文”.getBytes(“UTF-8”);
* 字符流: response.getWriter().println("")
* 设置浏览器打开的时候的编码
* resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
* 设置response的缓冲区的编码
* response.setCharacterEncoding(“UTF-8”);
**简化的写法:同时设置浏览器和response缓冲区:
***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”);
HttpSession
session何时创建和销毁?作用范围:
* 创建:服务器端第一次调用getSession()创建session.
* 销毁:三种情况销毁session:
* 1.session过期. 默认过期时间为30分钟.
* 2.非正常关闭服务器.如果正常关闭session序列化到硬盘.目录:apache-tomcat-7.0.69\work\Catalina\localhost\day11_web
* 3.手动调用session.invalidate();
* 作用范围:多次请求.(一次会话)
ServletContext
ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象.
ServletContext的作用:
* 1.用来获得全局初始化参数.
如:
<!-- Servlet全局初始化参数 在所有的servlet中使用ServletContext可以获取 -->
<context-param>
<param-name>username</param-name>
<param-value>root2</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>654321</param-value>
</context-param>
* 2.用来获得文件的MIME的类型.
【使用ServletContext对象读取WEB项目下的文件】
* InputStream getResourceAsStream(String path); --- 根据提供路径读取文件返回一个文件的输入流.
* String getRealPath(String path); --- 返回一个路径的磁盘绝对路径.
// getResourceAsStream:
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(is);
// getRealPath
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/WEB-INF/classes/db.properties");
// 获得该文件的磁盘绝对路径.
System.out.println(realPath);
InputStream is = new FileInputStream(realPath);
Properties properties = new Properties();
// 使用类的加载器来读取文件.(扩展)
// 类的加载器用来加载class文件,将class文件加载到内存.
InputStream is = ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(is);
获得文件的MIME的类型】
* 获得文件的MIME的类型.
代码实现:
/* 获得文件的MIME的类型 */
private void test2() {
String type = this.getServletContext().getMimeType("1.html");
System.out.println(type);
}
* 3.作为域对象存取数据.
ServletContext是一个域对象.
* 作用范围:整个web工程.
* 创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象.
* 销毁:服务器关闭的时候,或者项目从服务器中移除的时候.
* 用来存取数据:
* 用来向ServletContext中存入数据.
* 用来从ServletContext中获取数据.
* 用来从ServletContext中移除数据.
ServletConfig
ServletConfig:了解.获得Servlet的配置信息.就是web.xml中某个servlet中的初始化参数
如:
* String getServletName(); ---获得Servlet在web.xml中配置的name的值.
* String getInitParameter(String name); ---获得Servlet的初始化参数的.
* Enumeration getInitParameterNames(); ---获得所有Servlet的初始化参数的名称.