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>