一、Struts标签分类

二、标签的使用

  2.1  标签的主题

  • 主题的设置与struts.xml中的常量<constant name="struts.ui.theme" value="xhtml" /> 决定。
  • 每个主题都会对一些标签产生作用,而这些作用被定义在一些文件文件里,比如

    checkbox.ftl这个文件定义的是对checkbox标签产生作用的语法。

  • 主题共有以下几种(版本为struts2-core-2.3.14.jar):

路径为:struts2-core-2.3.14.jar包里的

    2.1.1  默认主题即template.xhtml , 会给标签自动添加一些属性或者子标签,可能打乱我们设计好的布局

  1. <body>
  2. <pre>
  3. <h3>默认主题</h3>
        <table border="1">
  4. <tr>
  5. <td>用户名</td>
  6. <td> <s:textfield></s:textfield> </td>
  7. </tr>
        </table>
  8. </pre>
  9. </body>
  • 我们原本的设计是这个表格一共一行且只有两个空格, 但是结果为:

  • 出现这种情况是因为,template.xhtml这个主题会自动帮标签添加一些属性或子标签,查看源代码可知产生了td和tr子标签:


  2.1.2  simple主题(最常用),额外添加的标签很少,不会对我们的布局产生大的影响。

  • 在struts.xml中设置常量<constant name="struts.ui.theme" value="simple" />

index.jsp

  1. <body>
  2. <pre>
  3. <h3>默认主题</h3>
  4. <table border="1">
  5. <tr>
  6. <td>用户名</td>
  7. <td> <s:textfield></s:textfield> </td>
  8. </tr>
  9. </table>
  10. </pre>
  11. </body>

查看源码:

  • 对比我们的代码,文本框只添加了name属性
  • 注意:在编写页面标签的时候,最好先把主题设置为simple主题,否则在布局的时候会很麻烦。

    2.1.3  定制主题

  •   步骤:

    •   在src目录下新建一个文件夹,叫template (template名不能改成别的)
    • 在template中在新建一个文件夹,名字自定义。
    • 在自定义的文件夹中,将要修改的控制的ftl文件拷贝,进行修改。比如我们定制的主题中有对文本输入标签进行设定,那么我们就可以到simple这个主题里找到text.ftl这个文件(注意:text.ftl这个文件主题系统会自动作用在文本框里,如果换成别的名字则无法起作用),然后拷贝到我们自定义的文件夹里,再对text.ftl这个文件进行修改。
    • 把text.ftl中需要添加的文件添加进来,text.ftl需要以下四个文件,然后在simple主题中找到这四个文件然后拷贝到自定义文件夹里即可。

    •   修改text.ftl

红框内的内容是我们添加的css属性。

    •   最后在标签中应用此主题,<s:textfield theme="self"></s:textfield>  //self为tempalte包的主题包名,因为这里我们只定义了一个标签的主题,如果我们在在self自定义主题包里对大量标签进行了主题设定,那么我不必每个标签都使用theme属性来引入主题,只需要struts.xml中设置常量<constant name="struts.ui.theme" value="self" /> 即可。

结果:

可知标签主题已经变成我们自定义的了。


  2.2  表单标签

    2.2.1  为什么要使用表单标签?(struts表单标签和input标签的区别)

  • struts表单标签可以与Action中的属性进行绑定,可以实现属性值到控件的Value值回填的操作。
  • 示例:
  • index.jsp:
  1. <body>
  2. <a href="<%=path%>/tag/form">表单标签</a>
  3. </body>
  • struts.xml
  1. <struts>
  2.  
  3. <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  4. <constant name="struts.multipart.maxSize" value="209715200"></constant>
  5. <constant name="struts.action.extension" value="action,,"></constant>
  6. <constant name="struts.enable.DynamicMethodInvocation" value="true" />
  7. <constant name="struts.devMode" value="true" />
  8. <constant name="struts.i18n.reload" value="true"></constant>
  9. <constant name="struts.ui.theme" value="simple" />
  10. <constant name="struts.configuration.xml.reload" value="true"></constant>
  11. <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
  12. <constant name="struts.handle.exception" value="true"></constant>
  13.  
  14. <package name="default" namespace="/tag" extends="struts-default">
  15. <action name="form" class="tag.FromAction">
  16. <result name="formjsp">/tag/form.jsp</result>
  17. </action>
  18. </package>
  19. </struts>
    1. FromAction .java
  1. package tag;
  2.  
  3. public class FromAction {
  4. private String textName;
  5.  
  6. public String getTextName() {
  7. return textName;
  8. }
  9.  
  10. public void setTextName(String textName) {
  11. this.textName = textName;
  12. }
  13.  
  14. public String execute(){
  15.  
  16. this.textName="Action对成员变量textNam赋值后会自动回填到表单中";
  17. return "formjsp";
  18. }
  19.  
  20. }
  • form.jsp
  1. <body>
  2. <pre>
  3. <s:textfield name="textName"></s:textfield>
  4.  
  5. </pre>
  6. </body>

结果:

  • 由结果可知,我们在Action中设置了一个成员变量textName,而这个成员变量名和<s:textfield name="textName"></s:textfield>是一样的,所以当我们在Action中对textName进行赋值的时候,struts会自动把值回填到<s:textfield name="textName"></s:textfield>标签里。 而如果在input标签中要实现数据的回填,则要在servlet中把值存放在作用域中,然后在jsp页面里用el表达式显示出来才行。
  • input标签实现数据回填:

把值存放在作用域中 :request.setAttribute("属性", "input标签实现数据回填");

    在jsp页面中把值取出来并显示: <input type="text" value="${requestScope.属性}"/>或者 <input type="text" value="<s:property value="#request.属性"/>"/>(request.setAttribute会吧属性放在广义值栈中的非狭义值栈的位置,所以需要用#来取值)。

  2.1.2  struts表单标签的分类

    •  文本框标签:<s:textfield name="textName"></s:textfield>  name属性用来与Action中的成员变量绑定,请查看上例。
    •   文本域标签:<s:textarea  name="remark"></s:textarea>
    •   密码框标签:<s:password name="passWd"></s:password>
    • 静态单选框_1 :
      1. <tr>
      2. <td>静态单选框:</td>
      3. <td>
      4. <s:radio list="{'男','女'}" name="sex_1"></s:radio></td>
      5. </tr>

      静态单选框中的list属性是必填的,list里的{}是OGNL表达式,意思是定义一个集合,本题中{'男','女'}意思是定义一个集合且这个集合中有两个string值。且list中集合有几个值那么就有几个单选按钮。如下图,每个单选按钮的值对应着集合中的值,如右下图。

    •   静态单选框_2 :单选框的值由我们来设置,而不是静态单选框_1 由集合的值来定义。这里用的是OGNL表达式中的“#{}” 表示定义一个MAP集合。
  1. <tr>
  2. <td>静态单选框_2:</td>
  3. <td><s:radio list="#{1:'男',0:'女'}" name="sex_1" ></s:radio></td>
  4. </tr>

    map集合中的1代表按钮value=“1”,表示如果用户选择的是“男”这个按钮,提交到后台的数据是“1” ,另一个按钮也是如此,查看源码:


  • 单选框使用:

在JSP页面中创建单选按钮radio的方法:

  1. <s:radio list="#{'1':'先生','0':'女士'}" name="gender" value="1"/>

其中list中的键值对表示所有的选项,value表示设置的默认值,如果这个默认值是从后台传过来的,可以这样设置:

  1. <s:radio list="#{'1':'先生','0':'女士'}" name="gender" value="gender.id"/>

  

当list属性为Action传过来的Map时 可以自动显示为key-value形式

  1. <s:radio list="%{map}" name="gender" value="gender.id "/>

当list属性为Action传过来的List<Gender>时 需要添加 listKey listValue属性  listKey对应提交到数据库中的值  listValue对应显示的文本

  1. <s:radio list="%{list}" name="gender" value="gender.id" listKey="id" listValue="genderText""/>

    •   动态单选框_1: 按钮value是从数据库或者其他地方获取的。
  • 示例:从数据库中读取值。

  A、  设计数据库并插入数据:

  B、 加载数据库驱动jar包,使用数据库开源工具包(ommons-dbutils-1.3.jar),可以帮助我们快速操作数据库,编写操作数据库的工具类。

B1. 编写工具类,获取数据库的连接Connection conn,DBUtil.java :

  1. package DBUtil;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.SQLException;
  6.  
  7. public class DBUtil {
  8. private static final String DRIVER="com.mysql.jdbc.Driver";
  9. private static final String USER="root";
  10. private static final String PASSWD="";
  11. private static final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
  12.  
  13. static{
  14. try {
  15. Class.forName(DRIVER);
  16. } catch (Exception e) {
  17.  
  18. throw new RuntimeException("无法加载驱动包");
  19. }
  20. }
  21.  
  22. public static Connection getConn(){
  23. Connection conn=null;
  24. try {
  25. conn= DriverManager.getConnection(URL,USER,PASSWD);
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }
  29.  
  30. return conn;
  31. }
  32. }

  B2. 使用数据库开源工具包(ommons-dbutils-1.3.jar),这个包的类提供了快速增删改查方法的实现。FormAction.java

  1. package tag;
  2.  
  3. import java.util.List;
  4.  
  5. import org.apache.commons.dbutils.DbUtils;
  6. import org.apache.commons.dbutils.QueryRunner;
  7. import org.apache.commons.dbutils.ResultSetHandler;
  8. import org.apache.commons.dbutils.handlers.BeanListHandler;
  9.  
  10. import com.opensymphony.xwork2.ActionContext;
  11.  
  12. import DBUtil.DBUtil;
  13. import actionUtil.BaseAction;
  14. import bean.UserBean;
  15.  
  16. public class FromAction extends BaseAction{
  17. /**
  18. * QueryRunner类为数据库开源工具包(ommons-dbutils-1.3.jar)封装的类,
  19. * 这个类实现了快速对数据库操作的方法。
  20. * 步骤:
  21. * 确认sql语句确定相应的方法,本题中select * 查询结果应该是一个集合。所以应该用QueryRunner的query()方法,
  22. * 而query()方法里的三个参数为“Connection conn,String sql,ResultSetHandler<T> t”其中ResultSetHandler
  23. * 是一个接口,我们往query()方法里填的参数不可能是接口而只能是其实现类,其中ResultSetHandler<T>的实现类BeanListHandler<T>类
  24. * 是本题中需要的类,把这个类的对象加到query()方法里,这个方法将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里,也就是说我们
  25. * 此时还需要创建一个javaBean类,这个类的成员属性(要有getset方法)要跟数据库中的列名一致。
  26. *
  27. */
  28.  
  29. public String execute() throws Exception{
  30. ActionContext actionContext=ActionContext.getContext();
  31.  
  32. String sql="select * from user order by userId";
  33. QueryRunner query=new QueryRunner();
  34. List<UserBean> list=query.query(DBUtil.getConn(), sql, new BeanListHandler<UserBean>(UserBean.class));
  35. actionContext.put("list", list);
  36.  
  37. return "formjsp";
  38. }
  39.  
  40. }
  • 补充:ResultSetHandler的各个实现类:
    ArrayHandler:把结果集中的第一行数据转成对象数组。
    ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
    BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
    BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
    MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
    MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
    ColumnListHandler:将结果集中某一列的数据存放到List中。
    KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
    ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点

  

 B3. 在jsp页面把值取出来  from.jsp

  1. <tr>
  2. <td>静态单选框_2:</td>
  3. <td><s:radio list="#list" name="sex_1" listKey="userId" listValue="userName"></s:radio></td>
  4. </tr>
  • list="#list" 表示往非广义值栈里取值为list的属性值(此时list存放的是javaBean对象的地址,所以取出来的也是地址),listValue="userName" 表示标签的属性value为javaBean对象的userName属性,

listKey="userId" 表单当用户选中某个选项的时候返回到后台的值。

结果:

参考刚才数据库里的数据



  • 动态单选框_2: 按钮value是从数据库或者其他地方获取的。(与动态单选框_1类似)

    •   在上例中,把DBUtil.java 文件修改如下(只是把上例的list转为Map):

      1. package tag;
      2.  
      3. import java.util.HashMap;
      4. import java.util.List;
      5. import java.util.Map;
      6.  
      7. import org.apache.commons.dbutils.DbUtils;
      8. import org.apache.commons.dbutils.QueryRunner;
      9. import org.apache.commons.dbutils.ResultSetHandler;
      10. import org.apache.commons.dbutils.handlers.BeanListHandler;
      11.  
      12. import com.opensymphony.xwork2.ActionContext;
      13.  
      14. import DBUtil.DBUtil;
      15. import actionUtil.BaseAction;
      16. import bean.UserBean;
      17.  
      18. public class FromAction extends BaseAction{
      19. /**
      20. * QueryRunner类为数据库开源工具包(ommons-dbutils-1.3.jar)封装的类,
      21. * 这个类实现了快速对数据库操作的方法。
      22. * 步骤:
      23. * 确认sql语句确定相应的方法,本题中select * 查询结果应该是一个集合。所以应该用QueryRunner的query()方法,
      24. * 而query()方法里的三个参数为“Connection conn,String sql,ResultSetHandler<T> t”其中ResultSetHandler
      25. * 是一个接口,我们往query()方法里填的参数不可能是接口而只能是其实现类,其中ResultSetHandler<T>的实现类BeanListHandler<T>类
      26. * 是本题中需要的类,把这个类的对象加到query()方法里,这个方法将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里,也就是说我们
      27. * 此时还需要创建一个javaBean类,这个类的成员属性(要有getset方法)要跟数据库中的列名一致。
      28. *
      29. */
      30.  
      31. public String execute() throws Exception{
      32. ActionContext actionContext=ActionContext.getContext();
      33.  
      34. String sql="select * from user order by userId";
      35. QueryRunner query=new QueryRunner();
      36. List<UserBean> list=query.query(DBUtil.getConn(), sql, new BeanListHandler<UserBean>(UserBean.class));
      37.  
      38. Map<String,String> userMap=new HashMap<String, String>();
      39.  
      40. if(list!=null){
      41. /**
      42. * 把List转换为Map
      43. */
      44. for(UserBean user:list){
      45. String userName=user.getUserName();
      46. String userId=user.getUserId();
      47. userMap.put(userId, userName);
      48.  
      49. }
      50. }
      51. actionContext.put("userMap", userMap);
      52.  
      53. return "formjsp";
      54. }
      55.  
      56. }

      form.jsp:

  1. <tr>
  2. <td>静态单选框_2:</td>
  3. <td><s:radio list="#userMap" name="sex_1" ></s:radio></td>
  4. </tr>
  • 此时就不用添加listValue和listKey属性了,因为Map就是键值对。

    • 下拉框标签:

      •   下拉框也有动态下拉框如果需要的话,可以参考动态单选框_1/动态单选框_2,但是下拉框一般是固定的值,没必要动态获取。
  1. <tr>
  2. <td>下拉框</td>
  3. <td><s:select list="{'福建','山东','河南'}" name="privince" headerKey="none" headerValue="---请选择---"></s:select></td>
  4. </tr>

    • 下拉框分组:
  1. <tr>
  2. <td>下拉框分组</td>
  3. <td>
  4. <s:select list="{'福建','山东','河南'}" name="privince" headerKey="none"
  5. headerValue="---请选择---">
  6. <s:optgroup list="#{1:'泉州',2:'莆田',3:'福州'}" label="福建" ></s:optgroup>
  7. </s:select>
  8. </td>
  9. </tr>
    1. <s:optgroup >标签只能放在<s:select>标签里,且list只能用"#{}"这个OGNL表达式也就是一定要用Map,否则错误。

label标签不可选定。


      • 复选框标签和复选框分组标签:

本例的文件与动态单选框_1中的文件相同,只有最后的form.jsp页面改成下面

  1. <tr>
  2. <td>复选框:</td>
  3. <td><s:checkbox name="is_check" value="true"></s:checkbox></td>
  4. </tr>
  5.  
  6. <tr>
  7. <td>复选框分组:</td>
  8. <td><s:checkboxlist list="#userMap" name="group"></s:checkboxlist></td>
  9. </tr>

结果:

  • 其中list="userMap"是数据库的数据封装为Map对象,而且<s:checkboxlist>中的list和name属性一定要写,name如果没写ftl文件会报name属性未定义这个错误。
    1. <s:checkboxlist>中的list如果是List集合,那么就要加listValue和listKey属性。

  隐藏域和文件域名标签

  1. <tr>
  2. <td>隐藏域</td>
  3. <td><s:hidden name="userId"></s:hidden ></td>
  4. </tr>
  5. <tr>
  6. <td>文本域</td>
  7. <td><s:file name="userface"></s:file ></td>
  8. </tr>

结果:


    •  表单标签:
  1. <s:form name="" id="" action="" method=""></form>
    • 按钮标签:

  • struts中没有普通按钮标签。

 

    •   上下下拉框(使用这个标签要在<head>标签里定义<s:head />标签,这个标签用于引入上下下拉框等标签所需的脚本文件)
  1.     <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>
  • 用法类似动态单选框_1和动态单选框_2

    •   选项传输下拉框(1. 使用这个标签要在<head>标签里定义<s:head />标签,这个标签用于引入上下下拉框等标签所需的脚本文件 2. 使用这个标签的时候不能用submit按钮提交,否则后台取值的时候会全部取到而不是只取用户选定的,只能通过定义普通按钮然后这个按钮触发一个javaScript脚本,在脚本里定义一个submit()方法提交)

    •   组合框标签(1.使用这个标签要在<head>标签里定义<s:head />标签,这个标签用于引入上下下拉框等标签所需的脚本文件 2. 使用这个标签的时候不能用submit按钮提交,否则后台取值的时候会全部取到而不是只取用户选定的,只能通过定义普通按钮然后这个按钮触发一个javaScript脚本,在脚本里定义一个submit()方法提交)


(八)Struts标签基础(一)的更多相关文章

  1. (九)Struts标签基础(二)

    2.3 非表单标签 2.3.1 <s:actionerror>标签, this.addActionError("错误信息1");   //使用addActionErro ...

  2. 2017-2018-2 20155228 《网络对抗技术》 实验八:Web基础

    2017-2018-2 20155228 <网络对抗技术> 实验八:Web基础 1. 实践内容 1.1 Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET ...

  3. 20145203盖泽双 《网络对抗技术》实践八:Web基础

    20145203盖泽双 <网络对抗技术>实践八:Web基础 1.实践目标 (1)编写Web前端--含有表单的HTML代码. (2)编写Web前端--javascipt验证用户名.密码的代码 ...

  4. 2017-2018-2 20155231《网络对抗技术》实验八: WEB基础实验

    2017-2018-2 20155231<网络对抗技术>实验八:Web基础 实验要求: Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  5. struts 标签<s:ierator>的简单使用说明

    struts 标签<s:ierator>的简单使用说明,只显示<s:ierator> 的前6条数据 <s:iterator value="lstVisitor& ...

  6. 转:Struts标签checkbox使用总结(默认选择设置)

    在使用struts标签html:checkbox 的时候,如何让checkbox框默认是选中的,一般情况 下都是当formbean里面该property的值和标签上value给定的值相等的时候,生成的 ...

  7. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用

    我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...

  8. [转]Struts标签库详解

    本文转自:http://hi.baidu.com/xzkcz/blog/item/5cf9f91f01beb9f4e0fe0bd4.html   Struts提供了五个标签库,即:HTML.Bean. ...

  9. JSTL、EL、ONGL、Struts标签的区别与使用

     一.JSTL 来源 我们使用JSP开发信息展现非常方便,也可嵌入java代码用来实现相关逻辑,但同样带来了很多问题: jsp维护难度增加 出事提示不明确,不容易提示 分工不明确等 解决上面的问题可以 ...

随机推荐

  1. Fiddler自动响应AutoResponder正则匹配

    AutoResponder-Add-Rule Editor 两个文本框,先说第一个: Mathes: 前缀为“EXACT:”表示完全匹配(大小写敏感) 无前缀表示基本搜索,表示搜索到字符串就匹配 前缀 ...

  2. Python数据预处理(sklearn.preprocessing)—归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer, normalize)

      关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常 ...

  3. linux使用nslookup查询dns

    nslookup命令主要用于查询DNS信息 nslookup工具的安装以及使用使用yum install bind-utils安装即可 交互模式与非交互模式直接运行nslookup即可进入交互模式,连 ...

  4. SQL-W3School-函数:SQL SUM() 函数

    ylbtech-SQL-W3School-函数:SQL SUM() 函数 1.返回顶部 1. SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM( ...

  5. AppCompatTextView可改变文本字体大小

    有这样一个需求,要求在一个列表中的每个条目中展示字数不限个数的文本.而且每个条目的宽度都是固定的,展示的文本如果过长,不可以用省略号显示,只能动态的调整(缩小)文本的字号来达到文本能完全显示的效果,而 ...

  6. osg 三维模型加载与解析(fbx、3ds、ive、obj、osg)

    void TeslaManage::OnlineTreeViewDoubleClick(const QModelIndex & index) { int row = index.row(); ...

  7. osg 场景漫游

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osg/Group> #include <os ...

  8. iOS 当键盘覆盖textFiled时简单的处理方法

    //方法1--- - (void)textFieldDidBeginEditing:(UITextField *)textField { if (iPhone5) { return; } else { ...

  9. 第一次linux下安装nginx记录

    CentOS 7 安装Nginx 并配置自动启动 1.下载Nginx安装包---->地址:http://nginx.org/en/download.html 2.上传安装包到服务期 : rz 命 ...

  10. (CVE-2017-7494)Samba远程代码执行[Linux]

    简介 此漏洞是针对开启了共享的smb服务 漏洞利用 启动msfconsole search is_known_pipename   搜索此模块 use exploit/linux/samba/is_k ...