Struts2学习笔记 | 表单标签
概述
-
表单标签将在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>
说明
对于select
和 checkboxlist
标签,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>