HttpServletRequeste和HttpServletResponse

文章目录

Servlet配置方式

  • 路径匹配(开发常用)
    以 / 开始 如:/a
    输入:localhost:8080/项目名称/a
  • 路径匹配,前半段匹配
    以 / 开始,但是以 * 结束 如:/ a / *
    其实就是一个通配符,匹配任意文字
    输入:localhost:8080/项目名称/aa/bb
  • 以扩展名匹配
    写法: 没有/ 以 * 开始 *.扩展名 .aa .bb

ServletContext是什么

  • ServletContext是什么?
  1. Servlet上下文
  2. 每个Web工程都只有一个ServletContext对象,说白了也就是不管在那个Servlet里面,获取到的这个类的对象都是同一个。
  3. 如何得到对象:
//获取对象
ServletContext context=getServletContext();

ServletContext有哪些作用?

  1. 获取全局配置参数
  2. 获取Web工程中的资源
  3. 存取数据,servlet间共享数据,域对象。

一、ServletContext 获取全局参数

HttpServletRequeste和HttpServletResponse
HttpServletRequeste和HttpServletResponse

二、ServletContext 获取Web应用中的资源

1.获取资源在tomcat里面的绝对路径
先得到路径,然后自己new InputStream
	//这里得到的是项目在Tomcat里面的根目录
	String path = context.getRealPath("");
	//这里得到的是全路径
	String path = context.getRealPath("file/config.properties");

2.getResourceAsStream 获取资源 流对象
3 通过classloader去获取工程下的资源, 类加载器(JDBC)

三、servlet间共享数据

  • ServletContext的作用(存/取数据)
  • 例子:用户登录,并查看是第几个登录此网站的人。
<!--登录页面-->
<body>
	<h1>请输入以下内容,完成登录</h1>
	<form action="loginServlet" method="get">
		账号:<input type="text" name="username"/><br>
		密码:<input type="text" name="password"/><br>
		<input type="submit" value="登录"/>
	</form>
</body>
<!--后台验证并返回给浏览器-->
// 1.获取数据
	String username = request.getParameter("username");
	String password = request.getParameter("password");
	System.out.println("username="+username+"==password="+password);
// 2.校验数据
	//向客户端浏览器页面输出内容
	PrintWriter pw=response.getWriter();
	if("daq".equals(username)&&"123".equals(password)){
		//pw.write("login success...");
		//成功就跳转到index.html
	
		//设置状态码
		response.setStatus(302);
		//定位跳转到位置是哪一个页面
		response.setHeader("Location","index.html" );
	}else{
		pw.write("login failed...");
	}
<!--登录成功的页面-->
<body>

	<h2>登录成功了</h2>
	<a href="">获取网站登录成功总次数</a>
</body>

四、ServletContext作用范围和生命周期

1–问:ServletContext何时创建,何时销毁
答:服务器启动的时候,会为托管的每一个Web应用程序,创建一个ServletContext对象,从服务器移除托管,或者是关闭服务器。
2–问:ServletContext的作用范围
答:只要在这个项目里面,都可以取,只要同一个项目, A项目 存,在B项目是取不到的,因为他们的对象不同。

HttpServletRequeste

  • 这个对象封装了用户提交过来的一切数据。
  1. 可以获取用户端请求头信息。
    HttpServletRequeste和HttpServletResponse
  2. 获取客户端提交的数据
// 1.取出请求里面的所有头信息 , 得到一个枚举集合
		Enumeration<String> headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			String name = headerNames.nextElement();
			String value = request.getHeader(name);
			System.out.println(name + "=" + value);
		}
		System.out.println("----------------");

		// 2.获取的是客户端提交上来的数据。
		String name = request.getParameter("name");
		String address = request.getParameter("address");
		System.out.println("name=" + name);
		System.out.println("address=" + address);

		System.out.println("----------------");

		// 3. 获取所有的数据,得到一个枚举集合
		// Enumeration<String> parameterNames = request.getParameterNames();
		Map<String, String[]> map = request.getParameterMap();
		Set<String> keySet = map.keySet();
		Iterator<String> iterator = keySet.iterator();
		while (iterator.hasNext()) {
			String key = (String) iterator.next();
			String value = map.get(key)[0];
			
			System.out.println(key+"=="+value);
			
		}
  1. 获取中文数据
    问题: 客户端提交数据给服务器端,如果数据中带有中文的话,有可能出现乱码情况。
    原因: get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的就是乱码。tomcat收到这批数据,getparameter默认使用ISO-8859-1去编码。
  • 如果是GET方式

解决方法:

  1. 代码转码
//先让文字回到ISO-8859-1,然后在按照utf-8拼接字符串
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username="+username+"==password="+password);
  1. 可以再Tomcat里面设置处理,以后get请求过来的数据永远是UTF-8编码HttpServletRequeste和HttpServletResponse
  • 如果是post方式
//这行设置一定要写在getParametr之前。
request.setCharacterEncoding("UTF-8");

HttpServletResponse

  • 负责响应(返回数据)给客户端
//以字符流的方式写数据
response.getWriter().write("hello response!!!");
//以字节流的方式写数据
response.getOutputStream().write("hello response....222".getBytes());

中文乱码问题

  • 响应的数据中包含中文,极有可能出生中文乱码
//以字符流输出,需要加入以下代码
//1.指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
		
//2.直接规定浏览器看这份数据的时候,使用什么编码来看。
response.setHeader("Content-Type", "test/html;charset=UTF-8");
  • 不管是字符流还是字节流,只用写下面这行代码
response.setContentType("text/html;charset-UTF-8");
然后在写数据即可!

下载资源

  1. 直接以超链接的方式下载,不写任何代码,也能够下载东西下来
    原因是tomcat里面有一个默认的Servlet --DefaultServlet,这个DefaultServlet专门用于存放在Tomcat服务器上面的静态资源。
<body>
	让tomcat的默认servlet去提供下载:<br>
	<a href="download/gui-config.json">gui-config.json</a><br>
	<a href="dowmload/OmegaOptions-fy0703.bak">OmegaOptions-fy0703.bak</a><br>
	<a href="download/*.exe">*.exe</a><br>
</body>

手动编码提供下载:

<!--index.html-->
<body>
	手动编码提供下载<br>
	<a href="Demo1?filename=gui-config.json">gui-config.json</a><br>
	<a href="Demo1?filename=OmegaOptions-fy0703.bak">OmegaOptions-fy0703.bak</a><br>
	<a href="Demo1?filename=*.exe">*.exe</a><br>
</body>
<!--servlet里面这么写-->
//1.获取要下载的文件名字
	String filename=request.getParameter("filename");
		
/2.获取这个文件在Tomcat里面的绝对路径地址
	String path=getServletContext().getRealPath("download/"+filename);
		
	response.setHeader("Content-Disposition","attachment;filename="+filename);
	
//3.转化成输入流
	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();
}
HttpServletRequeste和HttpServletResponseHttpServletRequeste和HttpServletResponse 怦然心痛 发布了61 篇原创文章 · 获赞 53 · 访问量 9642 私信 关注
上一篇:serlvet中的过滤器filter


下一篇:Filter