checkbox.ftl这个文件定义的是对checkbox标签产生做用的语法。css
路径为:struts2-core-2.3.14.jar包里的html
<body> <pre> <h3>默认主题</h3>
<table border="1"> <tr> <td>用户名</td> <td> <s:textfield></s:textfield> </td> </tr>
</table> </pre> </body>
index.jspjava
<body> <pre> <h3>默认主题</h3> <table border="1"> <tr> <td>用户名</td> <td> <s:textfield></s:textfield> </td> </tr> </table> </pre> </body>
查看源码:mysql
红框内的内容是咱们添加的css属性。sql
结果:数据库
可知标签主题已经变成咱们自定义的了。apache
<body> <a href="<%=path%>/tag/form">表单标签</a> </body>
<struts> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <constant name="struts.multipart.maxSize" value="209715200"></constant> <constant name="struts.action.extension" value="action,,"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.reload" value="true"></constant> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.configuration.xml.reload" value="true"></constant> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <constant name="struts.handle.exception" value="true"></constant> <package name="default" namespace="/tag" extends="struts-default"> <action name="form" class="tag.FromAction"> <result name="formjsp">/tag/form.jsp</result> </action> </package> </struts>
FromAction .java
package tag; public class FromAction { private String textName; public String getTextName() { return textName; } public void setTextName(String textName) { this.textName = textName; } public String execute(){ this.textName="Action对成员变量textNam赋值后会自动回填到表单中"; return "formjsp"; } }
<body> <pre> <s:textfield name="textName"></s:textfield> </pre> </body>
结果:数组
把值存放在做用域中 :request.setAttribute("属性", "input标签实现数据回填");jsp
在jsp页面中把值取出来并显示: <input type="text" value="${requestScope.属性}"/>或者 <input type="text" value="<s:property value="#request.属性"/>"/>(request.setAttribute会吧属性放在广义值栈中的非狭义值栈的位置,因此须要用#来取值)。工具
<tr> <td>静态单选框:</td> <td> <s:radio list="{'男','女'}" name="sex_1"></s:radio></td> </tr>
静态单选框中的list属性是必填的,list里的{}是OGNL表达式,意思是定义一个集合,本题中{'男','女'}意思是定义一个集合且这个集合中有两个string值。且list中集合有几个值那么就有几个单选按钮。以下图,每一个单选按钮的值对应着集合中的值,如右下图。
<tr> <td>静态单选框_2:</td> <td><s:radio list="#{1:'男',0:'女'}" name="sex_1" ></s:radio></td> </tr>
map集合中的1表明按钮value=“1”,表示若是用户选择的是“男”这个按钮,提交到后台的数据是“1” ,另外一个按钮也是如此,查看源码:
在JSP页面中建立单选按钮radio的方法:
<s:radio list="#{'1':'先生','0':'女士'}" name="gender" value="1"/>
其中list中的键值对表示全部的选项,value表示设置的默认值,若是这个默认值是从后台传过来的,能够这样设置:
<s:radio list="#{'1':'先生','0':'女士'}" name="gender" value="gender.id"/>
当list属性为Action传过来的Map时 能够自动显示为key-value形式
<s:radio list="%{map}" name="gender" value="gender.id "/>
当list属性为Action传过来的List<Gender>时 须要添加 listKey listValue属性 listKey对应提交到数据库中的值 listValue对应显示的文本
<s:radio list="%{list}" name="gender" value="gender.id" listKey="id" listValue="genderText""/>
A、 设计数据库并插入数据:
B、 加载数据库驱动jar包,使用数据库开源工具包(ommons-dbutils-1.3.jar),能够帮助咱们快速操做数据库,编写操做数据库的工具类。
B1. 编写工具类,获取数据库的链接Connection conn,DBUtil.java :
package DBUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER="com.mysql.jdbc.Driver"; private static final String USER="root"; private static final String PASSWD=""; private static final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8"; static{ try { Class.forName(DRIVER); } catch (Exception e) { throw new RuntimeException("没法加载驱动包"); } } public static Connection getConn(){ Connection conn=null; try { conn= DriverManager.getConnection(URL,USER,PASSWD); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
B2. 使用数据库开源工具包(ommons-dbutils-1.3.jar),这个包的类提供了快速增删改查方法的实现。FormAction.java
package tag; import java.util.List; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.opensymphony.xwork2.ActionContext; import DBUtil.DBUtil; import actionUtil.BaseAction; import bean.UserBean; public class FromAction extends BaseAction{ /** * QueryRunner类为数据库开源工具包(ommons-dbutils-1.3.jar)封装的类, * 这个类实现了快速对数据库操做的方法。 * 步骤: * 确认sql语句肯定相应的方法,本题中select * 查询结果应该是一个集合。因此应该用QueryRunner的query()方法, * 而query()方法里的三个参数为“Connection conn,String sql,ResultSetHandler<T> t”其中ResultSetHandler * 是一个接口,咱们往query()方法里填的参数不多是接口而只能是其实现类,其中ResultSetHandler<T>的实现类BeanListHandler<T>类 * 是本题中须要的类,把这个类的对象加到query()方法里,这个方法将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里,也就是说咱们 * 此时还须要建立一个javaBean类,这个类的成员属性(要有getset方法)要跟数据库中的列名一致。 * */ public String execute() throws Exception{ ActionContext actionContext=ActionContext.getContext(); String sql="select * from user order by userId"; QueryRunner query=new QueryRunner(); List<UserBean> list=query.query(DBUtil.getConn(), sql, new BeanListHandler<UserBean>(UserBean.class)); actionContext.put("list", list); return "formjsp"; } }
B3. 在jsp页面把值取出来 from.jsp
<tr> <td>静态单选框_2:</td> <td><s:radio list="#list" name="sex_1" listKey="userId" listValue="userName"></s:radio></td> </tr>
listKey="userId" 表单当用户选中某个选项的时候返回到后台的值。
结果:
参考刚才数据库里的数据
package tag; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.opensymphony.xwork2.ActionContext; import DBUtil.DBUtil; import actionUtil.BaseAction; import bean.UserBean; public class FromAction extends BaseAction{ /** * QueryRunner类为数据库开源工具包(ommons-dbutils-1.3.jar)封装的类, * 这个类实现了快速对数据库操做的方法。 * 步骤: * 确认sql语句肯定相应的方法,本题中select * 查询结果应该是一个集合。因此应该用QueryRunner的query()方法, * 而query()方法里的三个参数为“Connection conn,String sql,ResultSetHandler<T> t”其中ResultSetHandler * 是一个接口,咱们往query()方法里填的参数不多是接口而只能是其实现类,其中ResultSetHandler<T>的实现类BeanListHandler<T>类 * 是本题中须要的类,把这个类的对象加到query()方法里,这个方法将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里,也就是说咱们 * 此时还须要建立一个javaBean类,这个类的成员属性(要有getset方法)要跟数据库中的列名一致。 * */ public String execute() throws Exception{ ActionContext actionContext=ActionContext.getContext(); String sql="select * from user order by userId"; QueryRunner query=new QueryRunner(); List<UserBean> list=query.query(DBUtil.getConn(), sql, new BeanListHandler<UserBean>(UserBean.class)); Map<String,String> userMap=new HashMap<String, String>(); if(list!=null){ /** * 把List转换为Map */ for(UserBean user:list){ String userName=user.getUserName(); String userId=user.getUserId(); userMap.put(userId, userName); } } actionContext.put("userMap", userMap); return "formjsp"; } }
form.jsp:
<tr> <td>静态单选框_2:</td> <td><s:radio list="#userMap" name="sex_1" ></s:radio></td> </tr>
<tr> <td>下拉框</td> <td><s:select list="{'福建','山东','河南'}" name="privince" headerKey="none" headerValue="---请选择---"></s:select></td> </tr>
<tr> <td>下拉框分组</td> <td> <s:select list="{'福建','山东','河南'}" name="privince" headerKey="none" headerValue="---请选择---"> <s:optgroup list="#{1:'泉州',2:'莆田',3:'福州'}" label="福建" ></s:optgroup> </s:select> </td> </tr>
<s:optgroup >标签只能放在<s:select>标签里,且list只能用"#{}"这个OGNL表达式也就是必定要用Map,不然错误。
label标签不可选定。
本例的文件与动态单选框_1中的文件相同,只有最后的form.jsp页面改为下面
<tr> <td>复选框:</td> <td><s:checkbox name="is_check" value="true"></s:checkbox></td> </tr> <tr> <td>复选框分组:</td> <td><s:checkboxlist list="#userMap" name="group"></s:checkboxlist></td> </tr>
结果:
<s:checkboxlist>中的list若是是List集合,那么就要加listValue和listKey属性。
隐藏域和文件域名标签
<tr> <td>隐藏域</td> <td><s:hidden name="userId"></s:hidden ></td> </tr> <tr> <td>文本域</td> <td><s:file name="userface"></s:file ></td> </tr>
结果:
<s:form name="" id="" action="" method=""></form>
<tr>
<td>上下下拉框</td>
<td><s:updownselect list="{'1','2','3'}" name="text" cssStyle="width:60px"
allowMoveDown="true" allowMoveUp="true" allowSelectAll="true" moveDownLabel="向下移动" moveUpLabel="向上移动" selectAllLabel="全选"
></s:updownselect></td>
</tr>