文章目录
ServletContext
每个web工程都只有一个ServletContext对象,说白了也就是不管在哪个Servlet里面获取的这个类的对象都是同一个
如何获取对象
ServletContext context = getServletContext();
有什么作用
可以获取全局配置参数
//web.xml里面
<context-param>
<param-name>address</param-name>
<param-value>杭州</param-value>
</context-param>
//ServletContext01
package com.java.servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletContext01 extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
ServletContext servletContext = getServletContext();
String addr = servletContext.getInitParameter("address");
System.out.println("address="+addr);
}
protected void doPost (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
可以获取web应用中的资源
context.getRealPath("")//这里得到的是项目在tomcat里面的根目录
String path = context.getRealPath("file/config.properties");
第一种方式
public void test1() throws FilNotFoundException,IOException {
//获取ServletContext对象
ServletContext servletContext = getServletContext();
//获取路径
String path = servletContext.getRealPath("file/config.properties");
//创建属性对象
Properties properties = new Properties();
//创建流
InputStream inuptStream = new FileInputStream(path);
//连接加载流
properties.load(inputStream);
//具体操作
String name = properties.getProperty("name");
System.out.println("name="+name);
//关闭流
inputStream.close();
}
第二种方式
//创建ServletContext文件
ServletContext servletContext = getServletContext();
//获取属性对象
Properties properties = new Properties();
//打开流
InputStream inputStream = servletContext.getResourceAsStream("file/config.properties");
//连接加载流
properties.load(inputStream);
//具体操作
String name = properties.getProperty("name");
System.out.println("name="+name);
//关闭流
inputStream.close();
第三种方式:使用classLoader,不适用ServletContext
//创建属性对象
Properties properties = new Properties();
//创建流
InputStream inputStream = this.getClass.getClassLoader().getResourceAsStream("../../file/config.properties");
//加载流
properties.load(inputStream);
//操作
String name = properties.getProperty("name");
System.out.println("name="+name);
//关闭流
inputStream.close();
使用ServletContext存取数据
- 定义一个登陆的login.html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<h2>请输入一下内容,完成登陆</h2>
<form action="LoginServlet" method="get">
账号:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
登陆:<input type="submit" value="登陆" />
</form>
</body>
</html>
- 定义一个Servlet,名为LoginServlet
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServletResponse) {
//通过request获取客户端发来的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username="+username+",password="+password);
PrintWrite pw = response.getWrite();
if("admin".equals(username) && "123456".equals(password)) {
response.setHeader("Location",'login_success.html');
response.setStatus(302);//重定位
} else {
pw.write("login failed");
}
}
}
- 针对成功或者失败,进行判断,然后跳转到不一样的网页
ServletContext何时创建,何时销毁
- 服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
- 从服务器移除托管,或者是关闭服务器
HttpServletRequest
这个对象封装了客户端提交过来的一切数据
客户端是提交给服务器端,如果提交中带有中文的话,有可能会出现乱码情况,那么可以参照一下方法解决
- 如果是GET方式
//get请求过来的数据,再url地址栏上就已经经过编码了,所以我们取到的就是乱码。tomcat收到了这批数据,getParameter,默认使用ISO-8859-1去解码
String username = request.getParameter("username");
//先让文字回到ISO-8859-1对应的子节数组,然后再按utf-8组拼字符串
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
String password = request.getParameter("password");
System.out.println(username+":"+password);
还有一种简单的方式,直接在tomcat里面做配置,以后get请求过来的数据永远都是用utf-8编码
- 如果是POST方式
request.setCharacterEncoding("UTF-8");
这个设置一定要在request.getParameter()之前
HttpServletResponse
负责返回数据给客户端
- 输出数据到页面上
//以字符流的方式写数据
response.getWriter().write("<h1>hello response...</h1>");
//以字节流的方式写数据
response.getOutputStream().write("hello response222...".getBytes());
- 响应的数据中有中文,那么有可能出现中文乱码
- response.getWriter()
//指定输出到客户端的时候,这些文字使用utf-8编码
response.setCharacterEncoding("UTF-8");
//直接规定浏览器看这份数据的时候,使用什么编码来看
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.getWriter().write("我爱java");
- 以字节流输出(response.getOutputStream())
//指定浏览器看这份数据使用的码表
response.setHeader("Content-Type","text/html;charset=UTF-8");
//指定输出的中文用的码表
response.getOutputStream().write("我爱java".getBytes("UTF-8"));
注意:
不管是字节流还是字符流,直接使用一行代码就可可以了。
response.setContentType("text/html;charset=UTF-8");
下载文件(手动编码实现)
- download.html
<body>
<a href="/day17/downloadServlet?filename=1.jpg">图片1</a>
<a href="/day17/downloadServlet?filename=1.avi">视频</a>
</body>
- DownloadServlet
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取要下载的文件名称
String filename = request.getParameter("filename");
//获取ServletContext对象
ServletContext servletContext = this.getServletContext();
//获取文件真实路径
String path = servletContext.getRealPath("/img/" + filename);
//将图片加载进内存
FileInputStream fis = new FileInputStream(path);
//设置content-type
response.setContentType(servletContext.getMimeType(filename));
//对filename根据不同浏览器进行不同的处理
String agent = request.getHeader("user-agent");
filename = DownLoadUtils.getFileName(agent, filename);
//设置头信息
response.setHeader("content-disposition","attachment;filename="+filename);
//定义输出流
ServletOutputStream sos = response.getOutputStream();
//定义一个子节数组
byte[] bytes = new byte[1024 * 8];
//定义一个长度变量
int len = 0;
//开始写入图片
while((len = fis.read(bytes)) != -1) {
sos.write(bytes,0,len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}