HttpServletRequest和HttpServltResponse

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何时创建,何时销毁

  1. 服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
  2. 从服务器移除托管,或者是关闭服务器

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());
  • 响应的数据中有中文,那么有可能出现中文乱码
  1. response.getWriter()
//指定输出到客户端的时候,这些文字使用utf-8编码
response.setCharacterEncoding("UTF-8");
//直接规定浏览器看这份数据的时候,使用什么编码来看
response.setHeader("Content-Type","text/html;charset=UTF-8");

response.getWriter().write("我爱java");
  1. 以字节流输出(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");

下载文件(手动编码实现)

  • index.html
<h2>点击下载文件</h2>
<a href="Demo01?filename=aa.jpg">aa.jpg</a><br />
<a href="Demo01?filename=bb.txt">bb.txt</a><br />
<a href="Demo01?filename=cc.rar">cc.rar</a><br />
  • Demo01.java
public class Demo01 extends HttpServlet {
	protected void doGet(HttpServletRequest request,HttpServletResponse response) {
		//获取要下载的文件名称
		String fileName = request.getParameter("filename");
		//获取这个文件在tomcat里面的绝对路径
		String path = getServletContext().getRealPath("download/"+fileName);
		//让浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接展示
		response.setHeader("Content-Dispostion","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) {
			os.write(buffer,0,len);
		}
		os.close();
		is.close();
	}
}

注意:如果有中文文件需要下载则需要多加一部分代码

//获取来访客户端类型
String clientType = request.getHeader("User-Agent");

if(clientType.contains("Firefox")) {
	fileName = DownLoadUtil.base64ncodefileName(fileName);
} esle {
	//IE,或者chrome
	fileName = URLEncoder.encode(fileName,"UTF-8");
}

猜你喜欢

转载自blog.csdn.net/qq_42216575/article/details/92379882