刚接触struts没多久,就遇到了这么一个问题。。大家都知道在不用struts时,servlet要忘jsp上传值,就要request.setAttrute("","");需要什么值就传什么值,
而在struts中,jsp得到action中属性的值就不用传递,直接在页面用struts标签或EL表达式就能得到action中属性(即定义的javabean)的值,在这里就存在这么一个问题了。action是不是自动把action类中所有属性的值都封装到了request中,不然怎么jsp中怎么能去到所有属性的值呢,但如果是这样,假如在action定义了很多属性,当每次跳转页面的时候都要把这么多属性放进request中,而且有些值并不是我们所需要的,这样岂不是很浪费内存,很影响效率,
难道EL,或struts标签有智能的去action中取值的能力,显然这也是不怎么合理的,如果EL有这样自动取值的能力在servlet中我们就不用向request中放值了我实在不知道struts到底用到什么方式把值发到页面的,如果是第一种把所有值一起发到jsp中,浪费资源,影响效率,struts作为一个相当成熟的框架,不认为他的开发者没有考虑到这个问题,或是解决这个问题。。但假如是第二种情况显然又是存在矛盾的。。
我不知道有没有第三种情况,或针对此处问题的解决方法,请大侠给予指导。。

解决方案 »

  1.   

    struts1 or 2?
    楼主试试在struts1中不把任何东西手动存进session和request,el还能取到值么?
      

  2.   

    在struts中两个方法都是可以的,可以用request.setAttrute("",""),也能直接到JSP页面取值,是因为在actionServlet在调用doPost()或者doGet()方法时,就有把actionForm和action放在request中的操作
      

  3.   

    为什么要把不用的值放到 Action 里去呢- -就算是 servlet/jsp 的结构 你把不需要用的属性值取到 servlet里了
    但是却 不把它用在jsp 中这有何必呢-0-如果你说的那些取到Action 里用做计算的值你没有 get set 方法  不用 get的话 也不会传到页面去吧而且 客户端发送请求 在服务器执行请求后 才把得到的需要的值 以HTML 方式传给客户的
    所得到的 都是必须的静态数据 没用到的 不会传递 不会浪费资源吧
      

  4.   

    确切的说  是根据 客户 请求  使用GET() 拿到需要的数据
    而不是说 ACTION 去发给 JSP 数据了
    所以的计算都是服务器本身在做请求里GET了什么 就返回值给HTML 然后传给客户 哈哈我也是新手 不过大概是这样的 应该是不会占用资源- -
      

  5.   

    你可以进去研究下actionServlet中的doGet方法,调用了RequestProcesser中process,在process中做了非常多的事情,并不只是取页面中的表单数据。
      先取得action中的路径值,根据路径值到struts-config.xml中取出相应的action-Mapping标签,创建actionMapping对象,后再根据里面的name属性找到相应form-bean标签,创建actionForm对象,接着进行数据的收集,valid方法的校验,之后才是真正的调用action中的execute方法,最后返回一个actionForward对象,进行页面的转向。doget方法执行完后也表示这次的请求结束了。而里面的actionForm和action都是在request范围中,当然也可以设置成session
      

  6.   

    3楼已经说得很明白了,LZ所指的传值浪费都是jsp在服务器端编译时做的
      

  7.   


    是struts2
    struts2已经把要传递的值封装好了,他貌似会把action类中已有属性的值都装进去既然在页面上能得到
    action中所有属性的值,我像action是把所有值都传到jsp中了,但我们有时候不需要那写值,他总是传递不就浪费资源了吗
      

  8.   


    你是说action只会传递从当前request中得到的值吗??。。有点意思,有道理啊
      

  9.   


    你说的应该是action的设计的问题,这个会注意的,但我想了解action的传值方式
      

  10.   

    你说的应该是action的设计的问题,这个会注意的,但我想了解action的传值方式
      

  11.   

    Mark....顶贴是一种美德,O(∩_∩)O~
      

  12.   

    首先感谢大侠这段话对我很有用,再来讨论上面的问题:你的意思是action最终只是把当前request中得到的值封装并传递到下一个页面吗?action中定义的其他属性不会传到jsp中是吗?
      

  13.   


    //这是action类
    public class TestAction {
    private String username;
    private String password;
    private String sex;

    public String execute(){
    sex="FFFFFF";
    return "success";
    } public String getUsername() {
    return username;
    } public void setUsername(String username) {
    this.username = username;
    } public String getPassword() {
    return password;
    } public void setPassword(String password) {
    this.password = password;
    } public String getSex() {
    return sex;
    } public void setSex(String sex) {
    this.sex = sex;
    }
    }
    //掉用action的页面 test.jsp
    <s:form name="testform" method = "post" action = "TestAction">
    <s:textfield name="username" ></s:textfield>
    <s:password name="password"></s:password>
    <s:submit value="ok"></s:submit>
    //struts.xml配置
     <action name="TestAction" class="com.action.TestAction">
       <result >usershow.jsp</result>
       </action>//最终显示页面      ---都能显示
    姓名:${requestScope.username }
    密码:${requestScope.password }
    性别:${requestScope.sex }证明:action最终只是把当前request中得到的值封装并传递到下一个页面   这是不对的结果: 我更迷茫了。。找大侠求解