Servlet配置方式
-
全路径匹配
以 / 开始 /a /aa/bb
localhost:8080/项目名称/aa/bb
-
路径匹配 , 前半段匹配
以 / 开始 , 但是以 * 结束 /a/* /*
其实是一个通配符,匹配任意文字
localhost:8080/项目名称/aa/bb
-
以扩展名匹配
写法: 没有/ 以 * 开始 *.扩展名 *.aa *.bb
ServletContext
selevt的上下文。
每个web工程都只有一个ServletContext对象。不管在哪个servlet里面获取到的这个类的对象都是同一个。
有什么作用
- 获取全局配置参数
- 获取web工程中的资源
- 存取数据,servlet间共享数据 域对象
可以获取全局配置参数
Properties properties = new Properties();
/*
* 如果想获取web工程下的资源,用普通的FileInputStream写法是不行的。因为路径不对,这里的
* 相对路径,其实是根据jre来的,web工程,jre后面会交给tomcat管理,所以这里真正的相对路径 是tomcat里面的bin目录。
*/
InputStream is=new FileInputStream("classes/config.properties");
properties.load(is);
String adress = properties.getProperty("adress");
获取web工程下的资源,第一种方式:
ServletContext context = getServletContext();
//得到资源在tomcat里面的绝对路径
String path = context.getRealPath("file/config.properties");
Properties properties = new Properties();
InputStream is=new FileInputStream(path);
properties.load(is);
String adress = properties.getProperty("adress");
Alt+shift+m 抽取方法
Shift+Alt+z 抓取异常
获取web工程下的资源,第二种方式:
ServletContext context = getServletContext();
Properties properties = new Properties();
/*
* 相对路径:(有参照物)
* 绝对路径:(没有参照物)
*/
// 获取web工程下的资源,转换成流对象,前面隐藏了当前工程的根目录。
InputStream is = context.getResourceAsStream("file/config.properties");
properties.load(is);
String adress = properties.getProperty("adress");
获取web工程下的资源,第三种方式:
Properties properties = new Properties();
// 获取该java文件的class,然后获取到加载这个class到虚拟机中的那个类加载器对象。
InputStream is = this.getClass().getClassLoader().getResourceAsStream("../../file/config.properties");
properties.load(is);
String adress = properties.getProperty("adress");
ServletContext什么时候创建,什么时候销毁?
服务器启动的时候,会为托管的每一个web应用程序创建一个ServletContext对象。
从服务器移除托管或者是关闭服务器的时候会销毁ServletContext对象。
servletContext的作用范围:同一个项目中,不同项目会有不同的servletContext。
获取中文数据乱码解决方案
get
1,通过代码转码
// get请求的数据,在url上面就已经经过编码了,所以我们取到的就是乱码。
// tomcat收到数据,getParameter默认使用ISO-8859-1去解码。
// 先让文字回到ISO-8859-1对应的字节数组,然后再按照UTF-8组拼字符串。
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
2,可以在tomcat里面做设置处理(conf/server.xml)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
post
post请求可以通过设置请求体里面的文字编码,get不能使用。而且一定要写在getParameter之前。
request.setCharacterEncoding("UTF-8");
HttpServletResponse
负责返回数据给客户端。
响应的数据出现中文乱码
// 以字符流的方式写数据
response.getWriter().write("<h1>123456</h1>");
// 1.指定输出到客户端的时候,这些文字使用UTF-8编码。
response.setCharacterEncoding("UTF-8");
// 直接规定浏览器看到这份数据时,使用什么编码来看。
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 以字节流的方式写数据
// 直接规定浏览器看到这份数据时,使用什么编码来看。
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 默认情况下getOutputStream输出的是UTF-8的编码。 也可以在getBytes()里面指定编码。
response.getOutputStream().write("123456".getBytes("UTF-8"));
查看getBytes里面的默认码表
String name = Charset.defaultCharset().name();
不管是字节流还是字符流,直接使用一行代码就可以了。
response.setContentType("text/html;charset=UTF-8");
下载文件
直接以超链接的方式下载,不用写任何代码,也能够下载下来代码。
<a href="download/aa.jpg" target="_blank" rel="external nofollow" >aa.jpg</a><br>
<a href="download/bb.txt" target="_blank" rel="external nofollow" >bb.txt</a><br>
<a href="download/cc.rar" target="_blank" rel="external nofollow" >cc.rar</a><br>
原因是tomcat里面有一个默认的Servlet—DefaultServlet,这个DefaultServlet专门用于处理放置在tomcat服务器上的静态资源。
以代码的方式进行下载:
String filename = request.getParameter("filename");
// 如果Get请求,filename里面有中文
// filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(filename);
// 获取文件在tomcat里面的绝对路径
String path = getServletContext().getRealPath("download/"+filename);
/*
* IE和Chrome使用的是URLEncoding编码
* 如果是Firefox,使用的是Base64编码
* 判断浏览器类型,分别对中文进行处理,让下载框内也显示中文
*/
if(request.getHeader("User-Agent").contains("Firefox")) {
filename = base64EncodeFileName(filename);
}else {
filename = URLEncoder.encode(filename, "UTF-8");
}
// 显示一个弹出框,显示下载
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 转换成流
InputStream is=new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len=0;
byte[] buffer=new byte[1024];
while((len=is.read(buffer))!=-1) {
//System.out.println(len);
os.write(buffer, 0, len);
}
os.close();
is.close();