Servlet中的属性(attribute)和参数(parameter)的区别

1.引子

        初学者对属性(attribute)和参数(parameter)容易搞混。没搞清他们的区别,项目中就可能出现一此莫名其妙的问题。

2.两者的区别

1) 属性(attribute)

      属性是在后台servlet中设置并获取的 , 用方法setAttribute(name, o) 和 getAttribute(name)实现;

	//JDK源码
     public void setAttribute(String name, Object o);
     public Object getAttribute(String name);

      从源码也可以看出,属性的类型是任意类型的Object,在java后台代码中处理的业务千差成别,传递的数据类型一定要适应各种场景、条件,而Object这个所有类型的父类就可以满足这个要求。在获取属性时需要强制类型转换(为了获得该对象传递过来的数据),转换为它真实的类型,如果将其类型转换为其他非真实类型,将会导致类型转换失败,并抛出异常。

	 EmpAttend attend = getQueryCondition(request);
	 //可以设置任意类型的属性
          request.setAttribute("attendOfQuery", attend);
          request.setAttribute("greet", "hello");
          
          //必须转换为其真实的数据数据
          EmpAttend empAttend=(EmpAttend)request.getAttribute("attendOfQuery");
          String greet=(String)request.getAttribute("greet");

2) 参数(parameter)

      参数主要是将前端页面标签携带的信息(标签的name作为参数名,标签的value作为参数值)作为参数(可以类似地看成在前端页面设置参数)往后台传递数据。一般地,只能在后台获取参数或继续接力传递参数,而绝不能在后台设置参数,那么也就不存在后台往前台传参数这种可能了。另外还有一种情况,将参数拼接在URL中,可以变相地将实现“在后台设置参数”、“后台往前台传递参数”,但这并不是真正意义上的打破了原有的规则,因为URL还算是前端的内容。

	//JDK源码
    public String getParameter(String name);

      从源码也可以看出,参数的类型只有String这唯一确定的数据类型。这也与现实相符,前端页面,诸如表单等标签携带的数据只能是文本类型的数据,它很难携带其他复杂类型的数据。
在这里插入图片描述
      从IDE工具的代码提示功能可以看出,只能设置属性setAttribute(String,Object),而没有设置参数setParameter(String,String)的方法。

3. 变相打破规则

1)“后台往前台传递参数”(在后台设置参数)

	//后台servlet中的方法
    public String modify(HttpServletRequest request, HttpServletResponse response)
    {
        EmpAttend modifyAttend=getModifyData(request);
        System.out.println("修改的考勤信息是" + modifyAttend);
      int modifyRows=  adi.update(modifyAttend);
        System.out.println("修改考勤的记录行数是" + modifyRows);
return "forward:attendServlet?action=getAll&flag=修改信息方法中的url传递参数测试";
    }
//前端查询结果展示页面
<p>
		<a href="save.jsp">添加</a>
	</p>
<label>${param.flag }</label>
	<table width="60%" align="center" class="table">

在这里插入图片描述
      前台页面将servlet类中方法返回的url所包含的参数正确的显示出来了。

2) “前台往前台传递参数”

//查询结果页面的table >td标签中的超链接URL中拼接参数
 <a href="modify.jsp?id=${attend.id}&eno=${attend.eno}
 &ename=${attend.ename}&deptno=${attend.deptno }&daydate=${attend.dayDate}"
  >修改</a>
//修改页面获取前一个前台页面传递过来的参数
	考勤编号:<label>${param.id}</label> <br/>&nbsp;&nbsp;号:<label>${param.eno}</label> <br/>&nbsp;&nbsp;名:<label>${param.ename}</label>  <br/>
		部门编号:<label>${param.deptno}</label>  <br/>&nbsp;&nbsp;期:<label>${param.daydate}</label>  <br/>

在这里插入图片描述
在这里插入图片描述
      从以上两图可看出,修改页面已经成功获取另一个前台页面传递过来的参数。这说明了通过URL拼接参数,可以在不同前台页面间传递参数(Paramater),但是要注意在使用EL表达式是应该用"${param.name}“的格式,而不是”${name}";前者是获取参数(Paramater),而后者是在请求(request)中获取属性(Attribute),如果EL表达式用错了,将不能获得对应的参数。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值