第一部分:
首先理解ServlContext的用法:
1.1定义
ServletContext官方叫servlet上下文。服务器会为每一个工程创建对象,这个对象就是ServletContext对象,这个对象是全局唯一的。而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
1.2.ServletContext的作用
- 获取全局配置参数
例子:ServletContextDemo这个web工程;配置信息在web.xml里面设置;创建两个类,分别检验是否获取同一个的配置参数。 - 获取web工程中的资源
例子:demo03;(
加载配置文件,web工程目录下的config.propertites。
步骤:创建对象;指定载入数据源(这里需要小心路径的事项);读取 - 存取数据,servlet间共享数据 域对象
例子:demo04(注册登录例子,包括统计登录次数,次数就是利用contextServlet的共享域对象)
ServletContext 何时创建, 何时销毁?
服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
从服务器移除托管,或者是关闭服务器。
- ServletContext 的作用范围
只要在这个项目里面,都可以取。 只要同一个项目。 A项目 存, 在B项目取,是取不到的? ServletContext对象不同。
下面讲述HTTPServletRequest部分
在Servlet的API中,定义了一个HttpServletRequest接口,它继承ServletRequest接口,专门用于封装Http的请求,由于HTTP请求包含着请求行,请求头和请求体三部分,因此在HttpServletRequest中分别定义了接受请求行,请求头和请求体的相关方法。
-
可以获取客户端请求头信息
例子:RequestDemo01
//得到一个枚举集合
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = (String) headerNames.next Element();
String value = request.getHeader(name);
System.out.println(name+"="+value)
} -
获取客户端提交过来的数据
例子:RequestDemo01
//获取姓名和地址
String name = request.getParameter(“name”);
String address = request.getParameter(“address”);
System.out.println(“name=”+name);
System.out.println(“address=”+address);------------------------------------------------- //name=zhangsan&name=lisi&name=wangwu 一个key可以对应多个值。 Map<String, String[]> map = request.getParameterMap(); Set<String> keySet = map.keySet(); Iterator<String> iterator = keySet.iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); System.out.println("key="+key + "--的值总数有:"+map.get(key).length); String value = map.get(key)[0]; String value1 = map.get(key)[1]; String value2 = map.get(key)[2]; System.out.println(key+" ======= "+ value + "=" + value1 + "="+ value2); }
-
获取中文数据
例子:requestDemo02
客户端提交数据给服务器端,如果数据中带有中文的话,有可能会出现乱码情况,那么可以参照以下方法解决。
-
如果是GET方式
扫描二维码关注公众号,回复: 5898708 查看本文章-
代码转码
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);System.out.println("userName="+username+"==password="+password); //get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的就是乱码, //tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码 //先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串 username = new String(username.getBytes("ISO-8859-1") , "UTF-8"); System.out.println("userName="+username+"==password="+password); 直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。
-
可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding=“utf-8”
-
-
如果是POST方式
这个说的是设置请求体里面的文字编码。 get方式,用这行,有用吗? ---> 没用 request.setCharacterEncoding("UTF-8"); 这行设置一定要写在getParameter之前。
HTTPServletResponse的简介部分
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
例子:ResponseDemo01
-
输出数据到页面上
//以字符流的方式写数据 //response.getWriter().write("<h1>hello response...</h1>"); //以字节流的方式写数据 response.getOutputStream().write("hello response2222...".getBytes());
-
响应的数据中有中文,那么有可能出现中文乱码
1、以字符流输出
response.getWriter()
//1. 指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("我爱黑马训练营...");
2、以字节流输出
response.getOutputStream()
//1. 指定浏览器看这份数据使用的码表
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//2. 指定输出的中文用的码表
response.getOutputStream().write("我爱深圳黑马训练营..".getBytes("UTF-8"));