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");

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

  • 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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值