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表达式用错了,将不能获得对应的参数。

Servlet中的属性(attribute)和参数(parameter)的区别的更多相关文章

  1. Servlet中@WebServlet属性详解

    感谢原文作者:想当一只小小攻城狮 原文链接:https://blog.csdn.net/weixin_45493751/article/details/100559683 在Servlet中,设置了@ ...

  2. Servlet中获取POST请求的参数

    在servlet.filter等中获取POST请求的参数 form表单形式提交post方式,可以直接从 request 的 getParameterMap 方法中获取到参数 JSON形式提交post方 ...

  3. JavaWeb(一)Servlet中乱码解决与转发和重定向的区别

    前言 前面其实已经把Servlet中所有的内容都介绍完了,这篇讲补充一点乱码和重定向与转发之间的区别! 一.request请求参数出现乱码问题 1.1.get请求 1)乱码示例 get请求的参数是在u ...

  4. form中action属性后面?传递参数 获取不到

    $p_id = $_REQUEST['p_id']; echo "<h1>您将更新商品编号为<span>$p_id</span>的商品信息 <a h ...

  5. Servlet 中,out.print()与out.write()的区别

    最近刚学习了Ajax,其中有通过$.getJSON的实现方式 由于前后端传递值的时候会通过流的方式进行传递,这就不得不涉及到这方面的知识了 PrintWrite out=response.getWri ...

  6. [转]js对象中取属性值(.)和[ ]的区别

    原文地址:https://www.jianshu.com/p/6a76530e4f8f 今天在写js的过程中遇到这么一个问题,取一个对象的属性值,通过obj.keys怎么都取不出来,但是用obj[ke ...

  7. Servlet 中的out.print()与out.writer()的区别

    PrintWriter out = response.getWriter(); out.print(obj)其源码如下: public void print(Object obj) { write(S ...

  8. 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨

    1.引子 转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数.属性获取问题. 2.转发和重定向 1).转发 转发是服务器行为,将当前请求(Request)和响应( ...

  9. Request中Attribute 和 Parameter 的区别

    Attribute 和 Parameter 的区别 (1)HttpServletRequest类有setAttribute()方法,而没有setParameter()方法 (2)当两个Web组件之间为 ...

随机推荐

  1. Laravel框架中使用邮件发送功能

    这里是演示的用户注册之后,进行邮件激活的功能. 点击注册之后,系统会自动发送一个份邮件到注册者的邮箱,注册者点击链接激活账号. 先配置laravel中的(.env)文件 MAIL_DRIVER=smt ...

  2. linux jar 后台运行

    在linux系统中可以利用nohup来执行任何命令,并把命令自动调到linux后台运行,不锁定当前ssh窗口,也不会被ctrl + c,alt + F4之类打断程序的动行.如: nohup java ...

  3. 数据库路由中间件MyCat - 源代码篇(5)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 如之前所述,MyCat的连接分为前端和后端,下面是连接基本相关类图: 3.1 Closabl ...

  4. 数据库路由中间件MyCat - 使用篇(6)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 配置MyCat 4. 配置schema.xml schema.xml里面管理着MyCat的逻辑库.表,每张表 ...

  5. linux命令之上传文件和下载文件

    lrzsz-0.12.20.tar.gz是一款linux下命令行界面上支持上传和下载的第三方工具,能够起到很方便的作用. # rz 选择文件进行上传 # sz 文件名 sz后面跟文件名可以进行文件从l ...

  6. [转] 深度探索Hyperledger技术与应用之超级账本的典型交易流程

    转自: https://blog.csdn.net/HiBlock/article/details/80212499 个人感觉对交易流程描述的比较清楚,转载以备查看. 1 典型交易流程 下图所示为Hy ...

  7. ios 类似淘宝评论星星功能

    创建星星视图: //星星 _myview = [[UIView alloc]initWithFrame:CGRectMake(95, 5, 200, 50)]; UIPanGestureRecogni ...

  8. 4.Python的不堪一击到初学乍练(列表,元组)

    Python(列表,元组) 一.列表 列表初识 列表是python的基础数据类型之一,其他编程语言也有类似的数据类型. 比如JS中的数组, java中的数组等等,它是以[ ]括起来, 每个元素用&qu ...

  9. JDK12下的ArrayList源码解读 与 Vector的对比

    ArrayList源码阅读. //测试代码实现如下 private static void arrayList() { ArrayList<String> list = new Array ...

  10. centOS-7.5上安装redis-5.0.0