Struts2中jsp前台传值到action后台的三种方式以及valueStack的使用

struts2中的Action接收表单传递过来的参数有3种方法:


如,登陆表单login.jsp:

1 <form action="login" method="post"name="form1">
2  
3 
4   用户名:<s:textfieldname="username"/><br/>
5    密 码:<s:passwordname="password"/><br/>
6               <s:submit value="提交"/>
7  </form>

 


1.在Action类中定义表单属性,两者属性名称必须一致。提供setter,getter方法。即可接收到表单传过来的参数.


这种接收参数的方法,方便简单,但是结构性不是很好,且当表单传递来的参数很多的时候,整个Action类中充斥着setter,getter方法,程序结构不是很美观。

2.把表单传递过来的参数封装成一个类,然后调用其中的属性.


如,把login.jsp页面要传来的参数进行封装(例如:封装于Users 类)

 1 private String username;
 2 private String password;
 3 
 4 public String getUsername() {
 5   return username;
 6 }
 7 public void setUsername(String username) {
 8   this.username = username;
 9 }
10 public String getPassword() {
11   return password;
12 }
13 public void setPassword(String password) {
14   this.password = password;
15 }

 



然后再Action方法中,定义该类的对象就可以了,如

 1 public class loginAction extends ActionSupport{
 2 
 3 private Users users;
 4 
 5 public Users getUsers(){
 6 
 7 return users;
 8 
 9 }
10 
11 public void setUsers(Users users){
12 
13 this.users=users;
14 
15 }
16 
17 }

 



通过这种方法传值,还必须在jsp页面做一下处理,login.jsp中from1的属性名应该改成这样:

登陆表单login.jsp:

<form action="login" method="post"name="form1">用户名:<s:textfieldname="users.username"/><br/>密 码:<s:passwordname="users.password"/><br/><s:submit value="提交"/></form>

 



这种方法,在struts开发中是很常用的一种方法!

3.通过实现ModelDriven接口接收表单数据


首先Action类必须实现ModelDriven接口,同样把表单传来的数据封装起来,Action类中必须实例化该对象,并且要重写getModel()方法
public class loginAction extends ActionSupport implementsModelDriven<Users>{private Users users =new Users();public Users getModel(){return users;}}

 



4.valueStack的使用

 

 1 <table border="1" width="360">
 2    <caption>
 3     作者李刚的图书
 4    </caption>
 5    <!-- 迭代输出ValueStack中的books对象,其中status是迭代的序号 -->
 6    <s:iterator value="books" status="index">
 7     <s:if test="#index.odd == true">
 8      <tr style="
 9     </s:if>
10     <s:else>
11      <tr>
12     </s:else>
13     <td>
14      书名:
15     </td>
16     <td>
17      <s:property />
18     </td>
19     </tr>
20    </s:iterator>
21   </table>

 

Struts2将所有属性值封装在struts.valueStack请求属性里,可以通过request.getAttribute("struts.valueStack")获取。Action所有的属性都被封装到了ValueStack对象中,它类似于map,Action中的属性名可以理解为ValueStack中value的名字。可以通过valueStack.findValue("name")来取值。

 

 

BookService.Java

public class BookService
{// 模拟数据库private String[] books = new String[] {"疯狂Java讲义" ,"轻量级Java EE企业应用实战","疯狂Ajax讲义","疯狂XML讲义","Struts 2权威指南"};public String[] getLeeBooks(){return books;}}

 

 


GetBooksAction.java

 1 import com.opensymphony.xwork2.Action;
 2 import com.opensymphony.xwork2.ActionContext;
 3 
 4 public class GetBooksAction implements Action
 5 {
 6  private String[] books;
 7 
 8  public void setBooks(String[] books)
 9  {
10   this.books = books;
11  }
12 
13  public String[] getBooks()
14  {
15   return books;
16  }
17 
18  public String execute() throws Exception
19  {
20   String user = (String)ActionContext.getContext().getSession().get("user");
21   if (user != null && user.equals("crazyit"))
22   {
23    BookService bs = new BookService();
24    setBooks(bs.getLeeBooks());
25    return SUCCESS;
26   }
27   else
28   {
29    return LOGIN;
30   }
31  }
32 }
33 
34  
35 
36 
37 showBooks.jsp
38 
39 <table border="1" width="360">
40 
41 <%
42 
43 // 获取封装输出信息的ValueStack对象
44 ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
45 
46 // 调用ValueStack的fineValue方法获取Action中的books属性值
47 String[] books = (String[ ])vs.findValue("books");
48 
49 //迭代输出全部图书信息
50 for (String book : books){
51 %>
52 
53 
54 <tr>
55 <td>书名:</td>
56 <td><%=book%></td>
57 </tr>
58 <%}%>
59 
60 
61 </table>

 

转载于:https://www.cnblogs.com/printN/p/6502038.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】vi编辑器命令

1)进入vi的命令 vi filename : 打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename : 打开文件&#xff0c;并将光标置于第n行首 vi filename : 打开文件&#xff0c;并将光标置于最后一行首 vi /pattern filename: 打开文件&a…

The Architecture of Open Source Applications

http://www.aosabook.org/en/index.html 有 nginx http://www.aosabook.org/en/nginx.html转载于:https://www.cnblogs.com/cloudstorage/archive/2012/07/12/2588196.html

html2canvas生成海报的各种问题

html2canvas&#xff08;一&#xff09;官网下载安装&#xff08;二&#xff09;基础用法&#xff08;三&#xff09;生成海报问题canvas高分屏下的模糊问题html2canvas图片模糊问题canvas图片getImageData,toDataURL跨域问题1) 首先&#xff0c;图片服务器需要配置Access-Cont…

Bootstrap中DropDown插件显示下拉列表,点击下拉列表区域,不会再自动关闭。

目标&#xff1a; Bootstrap中DropDown插件显示下拉列表&#xff0c;点击下拉列表区域&#xff0c;不会再自动关闭。 参考&#xff1a;http://v3.bootcss.com/javascript/#dropdowns // http://stackoverflow.com/questions/19740121/keep-bootstrap-dropdown-open-when-cl…

前端字符串内HTML标签无效的处理方式

1&#xff09;将元素的innerText 赋值成 元素的 innerHTML。即可避免转义的问题&#xff0c;将字符串中包含的 HTML标签生效。 <div ref"introContent" class"intro__content">{{intro}}</div>mounted() {// let text this.$refs.introConte…

获取当前目录绝对路径

echo offecho 当前盘符&#xff1a;%~d0echo 当前盘符和路径&#xff1a;%~dp0echo 当前批处理全路径&#xff1a;%~f0echo 当前盘符和路径的短文件名格式&#xff1a;%~sdp0echo 当前CMD默认目录&#xff1a;%cd%echo 目录中有空格也可以加入""避免找不到路径echo 当…

【CSS】css特殊性-优先级-权重

注&#xff1a;文章来源&#xff1a;《css权威指南》 第三章。 部分未予记录css选择器可以用多种方式去选择元素&#xff0c;实际上一个元素可以由使用两个或者多个规则来匹配&#xff0c;每个规则都有各自的选择器。请看例子CSS:h1 {color: red;}body h1 {color: green;}h2.gr…

vue开发问题积累

mounted钩子中使用$refs出现undefined 原因&#xff1a;如果在DOM结构中的某个DOM节点使用了v-if、v-show或者v-for&#xff08;即根据获得的后台数据来动态操作DOM&#xff0c;即响应式&#xff09;&#xff0c;那么这些DOM是不会再mounted阶段找到的。 **解决方法&#xff1…

动态规划0—1背包问题

动态规划0-1背包问题 问题描写叙述&#xff1a;给定n种物品和一背包。物品i的重量是wi&#xff0c;其价值为vi&#xff0c;背包的容量为C。问应怎样选择装入背包的物品&#xff0c;使得装入背包中物品的总价值最大?对于一种物品&#xff0c;要么装入背包&#xff0c;要么不装。…

Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释

本文大部分参考自 http://blog.csdn.net/mayingcai1987/article/details/6200909 &#xff0c;对原文中的讲解FLAG_NEW_TASK地方加了一些自己的观点&#xff0c;用红色标记 1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 2. Task默认行为: (1) 前提: Activity A和Ac…

vmstat命令详解

参数详情&#xff1a; r runingb blockswpd 虚拟内存使用时间free 物理free内存buff 从硬盘--->内存的 缓冲cache 从内存--->硬盘的 缓存si 从磁盘写入swap的大小/sso 从swap写入磁盘的大小/sbi 块设备每秒接收的块数量bo 块设备每秒发送的块数量cs 每秒上下文切换次数us…

CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)...

策略模式(Strategy Pattern)&#xff1a;定义一系列算法类&#xff0c;将每一个算法封装起来&#xff0c;并让它们可以相互替换&#xff0c;策略模式让算法独立于使用它的客户而变化&#xff0c;也称为政策模式(Policy)。 模式角色与结构&#xff1a; 示例代码&#xff1a; usi…

评论 展开|收起

场景&#xff1a; 列表中文本最多三行&#xff0c;超出部分省略&#xff0c;并显示展开收起按钮&#xff0c;如果文本没有超出三行则不显示展开收起按钮 方案&#xff1a; 1&#xff09;在div 中添加一个span 然后给div设置超出三行省略&#xff0c;这时候就可以获取到文本高…

【原创】linux 下远程连接windows桌面

一、安装过程 首先到http://www.rdesktop.org下载rdesktop 解压后进入rdesktop文件夹 执行命令&#xff1a; [rootmaster swxing]#./configure [rootmaster swxing]#make ; make install 提示没有安装openssl-devel 执行命令安装openssl-devel&#xff08;以下是在centos下用yu…

什么是.NET

Microsoft.NET 是Microsoft XML Web Service平台。 平台包含4个主要部分1.底层操作系统--Windows。 2.辅助产品--.NET企业服务器。 3.Microsoft XML Web服务--.NET My Servers。 4.开发平台--.NET框架。 CLR和FCL提供的部分服务转载于:https://www.cnblogs.com/dongdongguo/arc…

springboot + ApplicationListener

ApplicationListener自定义侦听器类 Component public class InstantiationTracingBeanPostProcessor implementsApplicationListener<ContextRefreshedEvent> {private static final Logger LOG Logger.getLogger(InstantiationTracingBeanPostProcessor.class);privat…

c语言使用小结

mallocfree typedef struct{   int a;   int b;}HA; cpp是C的扩展在大多数CPP的头文件里 CPP用到的关键字都会被条件编译扩起来以方便C的使用 当C用时CPP用到的关键字不会被编译。本质上CPP是兼容C的。 .lib .o 是程序编译时要使用的己经编译的函数库。 minGW环境可以使用.…

JAVA学习之动态代理

JDK1.6中的动态代理 在Java中Java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口&#xff0c;通过使用这个类和接口可以生成一个动态代理对象。JDK提供的代理只能针对接口做代理 java.lang.reflect.Proxy 提供用于创建动态代理类和实例的静态方法&#xff0c;…

net开源项目

1 以色列 特思开源软件 http://cn.tersus.com/#Id3924 2 开源社区 http://www.ctochina.net/ .NET开源项目链接 http://www.cnblogs.com/dustinyang/articles/361479.html项目网址简介Rainbowhttp://www.rainbowportal.net/ http://sourceforge.net/projects/rainbowportal/The…

screen状态变Attached连接会话失败

使用xshell远程登录主机&#xff0c;使用screen命令启动程序运行至后台&#xff0c;意外发现screen session的状态为Attached&#xff0c;使用命令screen -r &#xff1c;session-id>,提示失败信息&#xff0c;重复多次无果。 解决方法&#xff1a;把自己踢掉&#xff0c;然…