JSP常用的几个内置对象

JSP内置对象的含义是可以直接在JSP页面中使用的对象,使用前不需要声明它,。可以不加声明和创建就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量。常用的JSP的几个内置对象为request、response、session。

一.request对象

用户每访问一个页面,就会产生一个HTTP请求。这些请求中一般包含了请求所需的参数值或者信息,如果将request对象看作是客户请求的一个实例,那么这个实例就包含了客户请求的所有数据。因此,可以通过request来获取客户端和服务端的信息,如IP地址、传递参数名和参数值、应用系统名,服务器主机名等。

                                                     request对象的常用的方法

方法 描述
getParameter() 该方法是取得请求中指定的参数值,返回String类型值
getParameterValues() 该方法是将同名称的参数一次性地读入到String类型的数组中
getParameterNames() 获取参数名称,它返回的是枚举类型
getMethod() 获取客户提交信息的方式,是post还是get
getServletPath() 获取JSP页面文件的目录
getHeader() 获取HTTP头文件中指定值,例如:accept、user-agent、content-type、content-length等
getRemoteAddr() 获取客户的IP地址
getServerName() 获取服务器的名称
getServerPort() 获取服务器端口
getHeaders() 获取标题信息
  1. 使用request对象接收请求参数

request对象有两种方法获得请求参数值,一个是getParameter(),另一个是getParameterValues()。

前端如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
  <form action="demo1_controller.jsp"  method="post">
        <div>
            <input type="text" name="uname">
        </div>
        <div>
            <input type="password" name="upsw">
        </div>
       <div>
               <input type="radio" name="sex" value="1" checked="checked" >男
               <input type="radio" name="sex" value="0" >女
      </div>
        <div>
               <input type="checkbox" name="km" value="0" />数学
               <input type="checkbox" name="km" value="1" />语文
                <input type="checkbox" name="km" value="2" />外语
        </div>
        <div>
              <select name="address">
              <option value="0" selected="selected">南京</option>
               <option value="1">北京</option>
                <option value="2">上海</option>
              
              </select>
        </div>
        <div>
        <input type="submit" value="提交查看">
        </div>
  </form>
  </body>
</html>

使用getParameter获得请求中指定参数值和使用getParameterValues获得数组

如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>

  </head>
  
  <body>
     <%
          //单值使用getParameter方法获取用户数据
          String c_name=request.getParameter("uname");
          
          String c_upsw=request.getParameter("upsw"); 
          String c_sex=request.getParameter("sex");
          //多值使用getParameterValues方法获取用户数据,返回值是个字符串数组
          String[] c_km=request.getParameterValues("km");
          String c_address=request.getParameter("address");
          
          if(c_sex.trim().equals("0")){
                c_sex="女";
          }else{
                c_sex="男";
          }
         for(int i=0;i<c_km.length;i++){
              if(c_km[i].trim().equals("0")){
              c_km[i]="数学";
              }else if(c_km[i].trim().equals("1")){
              c_km[i]="语文";
              }else if(c_km[i].trim().equals("2")){
              c_km[i]="外语";
              }
  }
        if(c_address.trim().equals("0")){
        c_address="南京";
        }else if(c_address.trim().equals("1")){
           c_address="北京";
     }else if(c_address.trim().equals("2")){
     c_address="上海";
     }
     //字符串缓冲类,通常适用于N多次连接操作,比如输入流操作,
     StringBuffer sb=new StringBuffer();
     sb.append("用户名"+c_name+",密码"+c_upsw+",性别"+c_sex);
     for(int i=0;i<c_km.length;i++){
     if(i==0){
     sb.append(",所选科目:"+c_km[i]);
     
     }else{
     sb.append("、"+c_km[i]);
     }
     }
     sb.append(",地址是:"+c_address);
     out.print(sb.toString());
     out.print("<br/>");
     out.print("项目名:"+request.getContextPath()+"<br>");
     out.print("URL:"+request.getRequestURI()+"<br>");
     out.print("ip:"+request.getServerName()+"<br>");
     out.print("端口:"+request.getServerPort()+"<br>");
     out.print("服务器路径:"+request.getServletPath()+"<br>");
     
     //请求转发
     //设置请求编码
     request.setCharacterEncoding("utf-8");
     //设置请求参数
     request.setAttribute("param1", sb.append(""));
     //获取Disptcher类
     RequestDispatcher disptcher= request.getRequestDispatcher("demo1_result.jsp");
     //执行转发
     disptcher.forward(request, response);
     
    
      %>

  </body>
</html>

运行结果如下所示:


在URL参数传递时,在页面地址后使用“?”连接请求参数,参数由“=”相连接表示参数名和参数值,一个请求携带多个参数用“&”连接。

 2.get和post区别

在form中,有个非常重要的属性method。method有两个值,分别是get和post。

get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2KB。安全性较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。如:搜索、查询等功能。

post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。比如:注册、修改、上传等功能。

3.请求乱码问题的处理

1.在接收请求的页面中规定请求字符编码的代码,如下所示:

//设置请求编码
 request.setCharacterEncoding("utf-8");

2.第二种方法是在取得参数值后,通过转码的方式将参数值转为合适的字符集,如下所示:
 

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8")
String city=new String(request.getParameter("city").getBytes("ISO-8859-1"),"utf-8");

3.通过编写一个Servlet过滤器来解决中文乱码问题,并可以通过配置过滤器解决所有请求处理字符集的问题,请求处理页面就不用关心字符集的处理了。第三种方法可以有效的防止上述的问题且移植性强。

  二.response对象

当用户访问一个页面时,就产生一个HTTP请求,服务器做出响应时调用的是response响应包。response响应包实现的是接口javax.servlet.http.HttpServletResponse。

                                                           reponse常用的方法

方法 说明
addHeader(String arg0,String arg1) 向页面种添加头和对应的值
addCookie(Cookie arg0) 添加Cookie信息
sendRedirect(String arg0) 实现页面重定向
setStatus(int arg0) 设定页面的响应状态码
setContentType(String arg0) 设定页面的MIME类型和字符集
setCharacterEncoding(arg0) 设定页面响应的编码类型

1.设置头信息

设置头信息包括设置页面返回的MIME类型、返回的字符集、页面中的meta等信息。其中设置MIME类型和返回的字符集尤为重要,因为它关系到页面的显示是否会出现乱码,有两种方法设置MIME类型和返回的字符集,分别如下:

response.setContentType(String type);//其中type的值为“text/html;charset=utf-8",当然可以为其他的MIME类型和字符集。

用page指令。基本固定格式是:

<%@ page contentType="text/html;charset=utf-8" language="java" %>

setContentType的用法

setContentType.jsp用来设置MIME类型和字符集,MIME设置为"text/html",字符集设置为"UTF-8",其源代码如下:

<%
response.setContentType("text/html;charset=UTF-8"); //设置字符集和MIME类型
String str=new String("这是测试例子".getBytes("ISO-8859-1"),"utf-8");
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <title>setContentType.jsp</title>


  </head>
  
  <body>
  <p>这里是一段中文字符</p>
  </br>
  <%=str %>
  </body>
</html>

运行结果如下所示:

从运行结果可以看出,脚本中经过转码的文字显示正常,而在HTML中的字是乱码。

使用page指令设定字符集,在写法和处理上都相对简单些,HTML中的中文字不需要转码,而且脚本中的中文字也不需要转码。

用page指令设置页面字符集 

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String str="这是测试例子";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <title>setContentType.jsp</title>


  </head>
  
  <body>
  <p>这里是一段中文字符</p>
  </br>
  <%=str %>
  </body>
</html>

运行结果如下所示:

JSP中页面设置字符集会破坏JSP容器自身的页面编码处理,所以不建议设置。但可以在Servlet中设定。用page指令设置字符集相对简单,所以在开发中一般采用这种模式 

设置头meta信息是指HTML页面中存在于<head></head>之间的信息。例如:

(1)<meta http-equiv="pragma" content="no-cache">:设定禁止浏览器从本地机的缓存中调用页面内容,设定后离开网页就不能从Cache中再调用。

(2)<meta http-equiv="cache-control" content="no-cache">:请求和响应遵循的缓存机制策略。

(3)<meta http-equiv="expires" content="0">:用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。

(4)<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">:向搜索引擎说明网页的关键字。

(5)<meta http-equiv="description" content="This is my page">:向搜索引擎说明网页的主要内容。

页面请求重定向和请求转发的区别

请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。

请求转发:服务器行为,request.getRequestDispatcher().forward(request,response);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。

三.Session对象

在web开发中,session对象同样占据着极其重要的位置,在开发中它是一个非常重要的对象,可以用来判断是否是同一用户,还可以用来记录客户的连接信息等。HTTP协议是一种无状态的协议(即不保存连接状态的协议),每次用户请求在接收到服务器的响应后,连接就关闭了,服务器端与客户端的连接就被断开。因此,当用户的浏览器没关闭,这个时候又发起请求,那么网站就应该识别出该用户的情况。这种情况下,session对象就起到了关键作用。

                                                   session相关概念

名称 说明
会话 当用户打开浏览器连接到一个Web应用时或者某个界面,当关闭浏览器这个过程称为一个会话。其实一打开一个浏览器就意味着打开了一个会话对象
session对象生命周期 当用户访问某个页面到关闭浏览器,这段时间称之为session对象的生命周期。也可以说是会话开始到结束这段时间称为session对象的生命周期
session对象与线程 一个用户一个线程,这样保证了多个用户单击同一页面时的session对象唯一性
session对象与Cookie对象 session对象与Cookie对象是一 一对应关系。JSP引擎会将创建好的session对象存放在对应的Cookie中

                                                         session对象常用方法

方法 说明
void setAttribute(String arg0,String arg1) 将参数名和参数值存放在session中
Object getAttribute(String arg0)  通过arg0中的参数获取参数值
Enumeration getAttribteName() 一个用户一个线程,这样保证了多个用户单击同一页面时的session对象唯一性
String getID() 获取session对象的ID值
void removeAttribute(String arg0) 移除指定中的参数
long getCreateTime() 获取对象创建的时间,返回结果是long型的毫秒数
int getMaxInactiveInterval() 获取session对象的有效时间
void setMaxInactiveInterval() 设置session对象的有效时间
Boolean isNew() 用于判断是否是一个新客户
void invalidate() 使session对象不合法即失效

代码如下所示:

session_save.jsp

<%@page import="com.stujy.UserInfo"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>




</head>

<body>
	<%
		session.setAttribute("param1", "这是session的数据!");
		UserInfo ui = new UserInfo();
		ui.setNc("昵称");
		session.setAttribute("ui", ui);
		//response.sendRedirect("session_test.jsp");
	%>
	<button onclick="tiaozhuan()">跳转</button>
	<script type="text/javascript">
		function tiaozhuan() {
			location.href = "session_test.jsp";
		}
	</script>
</body>
</html>

运行如下所示:

 当点击跳转按钮会跳转至session_test.jsp页面

session_test.jsp: 

<%@page import="com.stujy.UserInfo"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	
%>

<html>
<head>


</head>

<body>
	<%
		 String param1=(String)session.getAttribute("param1");
		 UserInfo ui=(UserInfo)session.getAttribute("ui"); //
		 out.print(param1+"</br>");
		 out.print(ui.getNc());
	%>

</body>
</html>

运行结果如下所示:

session默认在服务器上的存储时间为30分钟,当客户端停止操作30分钟后,session中存储的信息会自动失效。此时调用getAttribute()等方法将出现异常。 

猜你喜欢

转载自blog.csdn.net/qq_41338249/article/details/82944753