Web 对象


一 、HttpServletRequest 对象

1.1 概念

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

1.2 作用

  • 获得前端页面传来的参数
//获取单一的值
String name = request.getParameter("name1");
//获取复合值参数
String[] hobby = request.getParameterValues("hobby");
System.out.println(name);

for (String o : hobby) {
System.out.println(o);
}
//获取所以参数的键值对的集合
Map<String, String[]> map = request.getParameterMap();
Collection<String[]> values = map.values();
for(String[] str : values){
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
  • 获得地址相关的信息
// 1 获得请求的协议
String scheme = request.getScheme(); // http
// 2 获得主机名
String host = request.getServerName();
// 3 获得主机端口
int port = request.getServerPort();
// 4 获得根目录名
String root = request.getContextPath();
System.out.println(root);
// 5 获得本次访问的路径
String path = request.getServletPath();
String url = scheme + "://" + host + ":" + port + "/" + root + path;
System.out.println(url);
  • 获得请求头中的信息
// 1 获得请求头中的信息
System.out.println(request.getHeader("User-Agent"));//浏览器信息
  • 获得客户端的语言环境
语言环境:【语言-地区 zh-CN zh-TW】
// 1 获得语言环境
Locale locale = request.getLocale();
System.out.println(locale);
  • 改变请求的字符集,修改post请求参数的乱码问题
// 1 改变请求的字符集
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name1");
System.out.println(name);
补充: get 请求 真的没有问题吗? 换成tomcat7 看看
 1、描述看到的现象 (post get 请求是否有乱码)
post请求和get请求都有乱码问题

    2、如果get请求有乱码 那么怎么解决

Tomcat8已经解决GET乱码问题,因为Tomcat8的URL编码是UTF-8,而Tomcat7的是IOS-8859-1;Tomcat7解决get乱码的方式:可以在server.xml中修改编码集为UTF-8,另外一种是将乱码的字符串进行转换,比如
String name = new String(request.getParameter("name1").getBytes("ISO-8859-1"),"UTF-8");

二 、HttpServletResponse 对象

2.1 概念

servlet中通过HttpServletReponse对客户端进行响应。

2.2 作用

  • 往客户端写响应内容
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
//使用默认时区和语言环境获得一个日历
Calendar cale = Calendar.getInstance();
//将Calendar类型转换成Date类型
Date tasktime=cale.getTime();
//设置日期输出的格式
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格式化输出
String nowTime = df.format(tasktime);
StringBuffer sb = new StringBuffer();
sb.append("<p>");
sb.append("当前时间是:");
sb.append(nowTime);
sb.append("</p>");
String str = sb.toString();
response.getWriter().append(str);
response.getWriter().close();
  • 改变响应的字符集
response.setCharacterEncoding("utf-8");

  • 改变响应内容的格式
// 3 改变内容的格式(默认格式 text/html )
response.setContentType("application/vnd.ms-excel");
// 4 改变响应头 设置附件的名字
response.setHeader("Content-Disposition", "attachment; filename=lxk2.xls");

三 、重定向 和 转发

3.1 共同点(作用)

// 站内转发能传递数据
request.setAttribute("key1", "v1");
request.getRequestDispatcher("/servlet").forward(request, response);

//站外重定向
// 1 获得请求的协议
String scheme = request.getScheme(); // http
String host = request.getServerName();
int port = request.getServerPort();
String url = scheme + "://" + host + ":" + port + "/servlet";
System.out.println(url);
response.sendRedirect(url);

3.2 不同点

  • 转发 的第一个请求和第二个请求实际上是同一请求(请求转发):所以我们需要通过request 把参数接着往下传的时候 需要使用转发
  • 重定向 第一个请求和第二个请求是两个不同的请求
  • 站内转发 和 站外重定向

四 、HttpSession

4.1 概念

会话对象: 指定是对站点建立起一个会话的周期

4.2 作用

保存当前用户的状态的(当前用户的身份信息)

4.3 使用

// 1 获得会话对象 并且往对象存储一些数据(后面的页面上获得)
HttpSession session = request.getSession();
session.setAttribute("key2", "v2");
// 在后面一个servlet 取出
System.out.println(request.getSession().getAttribute("key2"));

4.4 思考

为什么 资源和资源之间的传值 为什么不全部使用session 这样就不用区分重定向 和 转发了?
requset也能传递数据,但是只能转发才能传递数据,session生命周期比request长,重定向和转发都能传递数据,但是一个用户就会开一个会话,多个session会占用服务器资源,会让服务器死掉。所以一般传递数据会用request。

五 、ServletContext 对象

5.1 概念

上下文对象,全局对象【一个】

5.2 作用

  • 获得web根目录下任意文件的真实路径
// 1 获得全局对象
ServletContext application = request.getServletContext();
// 2 往全局对象中存东西
application.setAttribute("ak1", "av1");
// 3 获得web 根目录下 任意文件的真实路劲
String realPath = application.getRealPath("/excel/lxk.xlsx");
System.out.println(realPath);
  • 获得web根目录下任意文件的内容以流的形式返回
// 4 获得web根目录下 任意文件的内容 以流形式返回
response.setContentType("application/vnd.ms-excel");
// 5 改变响应头 设置附件的名字
response.setHeader("Content-Disposition", "attachment; filename=lxk2.xlsx");
response.setCharacterEncoding("utf-8");
InputStream in = application.getResourceAsStream("/excel/lxk.xlsx");
byte[] b = new byte[1024];
int len = in.read(b);
while (len > 1) {
response.getOutputStream().write(b, 0, len);
len = in.read(b);
}
response.getOutputStream().close();
  • 获得全局的配置参数
System.out.println(request.getServletContext().getInitParameter("pname"));
System.out.println(this.getServletConfig().getInitParameter("pname"));
<init-param>
<param-name>pname</param-name>
<param-value>init-param</param-value>
</init-param>

<context-param>
<param-name>pname</param-name>
<param-value>context-name</param-value>
</context-param>
  • 全局的作用域
    *.setArribute(key,value) * (request session,servletContext)

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值