天天看点

HttpServletRequest 和 HttpServletResponse

Servlet配置方式

  1. 全路径匹配

    以 / 开始 /a /aa/bb

    localhost:8080/项目名称/aa/bb

  2. 路径匹配 , 前半段匹配

    以 / 开始 , 但是以 * 结束 /a/* /*

    其实是一个通配符,匹配任意文字

    localhost:8080/项目名称/aa/bb

  3. 以扩展名匹配

    写法: 没有/ 以 * 开始 *.扩展名 *.aa *.bb

ServletContext

selevt的上下文。

每个web工程都只有一个ServletContext对象。不管在哪个servlet里面获取到的这个类的对象都是同一个。

有什么作用

  1. 获取全局配置参数
  2. 获取web工程中的资源
  3. 存取数据,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();
           

继续阅读