美文网首页Java 杂谈
Struts2学习笔记 | 表单标签

Struts2学习笔记 | 表单标签

作者: 一颗白菜_ | 来源:发表于2019-08-04 11:03 被阅读1次

    概述

    • 表单标签将在HTML文档里被呈现为表单元素

    • 使用表单标签的优点
      表单回显
      对页面进行布局和排版

    • 标签的属性可以被赋值为一个静态的值或一个OGNL表达式,如果在赋值时使用了一个OGNL表达式并把它用%{}括起来,这个表达式将会被求值

    • Struts2的form标签会自动的生成一个table

    • 可以对表单提交的值进行回显
      栈顶对象开始匹配属性,并把匹配到的属性值赋到对应的标签的value值,若栈顶对象没有对应的属性,则依次向下找对应的属性


    一些简单的标签

    例如隐藏域<s:hidden></s:hidden>,输入框<s:textfield ></s:textfield>,密码输入框<s:password ></s:password>,提交<s:submit></s:submit>,表单<s:form> </s:form>等等。

    直接看Demo吧
    form-tag.jsp:

    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%--
      Created by IntelliJ IDEA.
      User: 白菜
      Date: 2019/8/4
      Time: 9:09
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <s:form action="save">
            <s:hidden name="userId"></s:hidden>
            <s:textfield name="userName" label="UserName"></s:textfield>
            <!-- password标签默认不回显 -->
            <s:password name="passWord" label="PassWord" showPassword="true"></s:password>
            <s:textfield name="desc" label="Desc"></s:textfield>
            <s:submit></s:submit>
        </s:form>
    </body>
    </html>
    
    

    struts.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    
    <struts>
        <!-- 配置Struts可以受理的请求的扩展名 -->
        <constant name="struts.action.extension" value="action,,do"></constant>
        <package name="default" extends="struts-default" strict-method-invocation="false">
            <action name="save" class="struts.label.UserAction" method="save">
                <result name="input">/8_4/form-tag.jsp</result>
            </action>
        </package>
    
    </struts>
    

    UserAction.java:

    package struts.label;
    
    import com.opensymphony.xwork2.ActionContext;
    
    public class UserAction {
        private String userId;
        private String userName;
        private String passWord;
        private String desc;
        private boolean married;
    
        public boolean isMarried() {
            return married;
        }
    
        public void setMarried(boolean married) {
            this.married = married;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        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 getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
    
        public String save(){
            System.out.println(this);
    
            return "input";
        }
    
        @Override
        public String toString() {
            return "UserAction{" +
                    "userId='" + userId + '\'' +
                    ", userName='" + userName + '\'' +
                    ", passWord='" + passWord + '\'' +
                    ", desc='" + desc + '\'' +
                    ", married=" + married +
                    '}';
        }
    }
    
    

    checkbox标签

    • checkbox标签将呈现为一个HTML复选框元素,该复选框元素通常用于提交一个布尔值

    • 在HTML中,当包含着一个复选框的表单被提交时,如果某个复选框被选中,则它的值为true,并在HTTP请求参数添加一个请求参数,但如果该复选框未被选中,在请求中就不会增加一个请求参数

    • checkbox标签解决了这个局限性,如果没有选中的话,它将提交一个false,如果选中了将提交一个true

    • 关于checkbox标签解决赋值的原理
      我们首先添加一个checkbox标签:<s:checkbox name="married" label="Married" ></s:checkbox>,然后查看其网页HTML源代码,源码如下:
      <input type="checkbox" name="married" value="true" checked="checked" id="save_married"/>
      <input type="hidden" id="__checkbox_save_married" name="__checkbox_married" value="true" />
      <label for="save_married" class="checkboxLabel">Married</label>
      其有两个input标签,第一个input标签对应我们编写的<s:checkbox>/s:checkbox>,第二个则是一个隐藏域,默认为true
      当我们选中复选框时,那么第一个input标签的value的值将会是true,那么提交的时候两个input的值都为true,则Struts2将其标签值设置为true
      当我们没选中复选框时,第一个input标签的value值为空,提交的时候只有一个input的值为true,那么Struts2将其标签值设置为false
      这样就解决了传统的HTML标签出现的问题。


    select标签

    • select标签将呈现一个select元素

    • 比较常用的属性:

    名字 数据类型 默认值 说明
    headerKey String 选项列表中第一个选项的键
    headerValue String 选项列表中第一个选项的值
    list String 用来充当选项来源的可遍历对象
    listKey String 用来提供选项值的对象属性
    listValue String 用来提供选项行标的对象属性

    Demo

    <!-- 一个下拉框 -->
    <s:select list="{11,12,13,14,15,16,17,18,19,20}"
                headerKey=""
                headerValue="请选择"
                name="age"
                label="Age">
    </s:select>
    

    optiongroup标签

    • optiongroup标签对select元素所提供的选项进行分组,每个选项都有它自己的来源

    • 属性如下:

    名字 数据类型 默认值 说明
    list String 用来充当选项来源的可遍历对象
    listKey String 用来提供选项值的对象属性
    listValue String 用来提供选项行标的对象属性

    Demo:

    <s:select list="{11,12,13,14,15,16,17,18,19,20}"
                headerKey=""
                headerValue="请选择"
                name="age"
                label="Age">
                <!--
                    s:optgroup可以用作s:select的子标签,用于显示更多的下拉框
                    注意:必须有键值对,而不能使用一个集合,让其既作为键,又作为值
                    但是这个不一定是一定要Map,也可以是传入一个包含对象的集合,然后指定键和值就好
                -->
                <s:optgroup label="21-30" list="#{21:21,22:22}"></s:optgroup>
                <s:optgroup label="31-40" list="#{31:31}"></s:optgroup>
     </s:select>
    

    checkboxlist标签

    • checkboxlist标签将呈现一组多选框

    • 属性

    名字 数据类型 默认值 说明
    list String 用来充当选项来源的可遍历对象
    listKey String 用来提供选项值的对象属性
    listValue String 用来提供选项行标的对象属性
    • checkboxlist标签被映射到一个字符串数组或是一个基本类型的数组,若它提供的多选框一个也没有被选中,相应的属性将被赋值为一个空数组而不是一个空值

    Demo
    忽略City类的代码

        <%
            List < City > cities = new ArrayList <City>();
            cities.add(new City(1001,"aa"));
            cities.add(new City(1002,"bb"));
            cities.add(new City(1003,"cc"));
            cities.add(new City(1004,"dd"));
            request.setAttribute("cities",cities);
        %>
    <s:checkboxlist list="#request.cities"
                listKey="cityId" listValue="cityName"
                label="City" name="city">
    </s:checkboxlist>
    

    说明

    对于selectcheckboxlist标签,list属性可以自己编写键值对,此时要以#{key1:value1,key2:value2}的格式来写。当然也可以通过编写一个类,然后将要编写的属性写在类的属性中。然后创建一个包含若干个该对象的List集合,并通过checkboxlist的Demo中的方式那样编写。


    主题

    前面说到在编写<s:form>标签时会自动生成一个table标签,其实这是因为主题

    • 主题是为了让所有的UI标签能够产生同样的视觉效果而归集到一起的一组模板,即风格相近的模板被打包为一个主题

    • 四种主题

    simple:把UI标签翻译成最简单的HTML对应元素,而且会忽视行标属性
    xhtml:xhtml是默认的主题,这个主题的模板通过使用一个布局表格提供了一种自动化的排版机制
    css_xhtml:这个主题里的模板与xhtml主题里的模板很相似,但他们将使用css来进行布局和排版
    ajax:这个主题里的模板以xhtml主题里的模板为基础,但增加了一些Ajax功能。

    • 在一个表单里,若没有给出某个UI标签的theme属性,它将使用这个表单的主题。

    • 修改主题的方法
      有三种
      第一种是直接修改UI标签里的theme属性,例如<s:form action="emp-save" theme="simple"></s:form>,这样就把主题修改为simple了
      第二种是在page,request,session,application中添加一个theme属性,例如request.setAttribute("theme","simple");
      第三种是修改struts.properites文件中的struts.ui.theme属性,此时修改的是全局的主题,一般是在struts.xml文件中修改,例如<constant name="struts.ui.theme" value="simple"></constant>

    相关文章

      网友评论

        本文标题:Struts2学习笔记 | 表单标签

        本文链接:https://www.haomeiwen.com/subject/txyedctx.html