Struts2中定义一组新的标签库,使用struts的标签库和JSTL类似。
Struts2标签需要结合OGNL表达式一起使用,注意Struts2中对EL支持不太好。
使用Struts标签库需要先导库:
<%@ taglib prefix="s" uri="/struts-tags" %>
1.通用标签
<s:property value=""/>
property标签可以输出对象栈中对象的属性,或者map栈中的对象,value属性中的值,会被OGNL解析
例子:
<!--s:property可以直接获取到对象栈中对象的属性 -->
<s:property value="username"/>
<!-- property可以获取到Map栈中的对象 -->
<s:property value="#session.username"/>
<s:property value="#request.username"/>
<!-- parameters的结构map<String,String[]>
一般我们在使用parameters都需要加索引
-->
<s:property value="#parameters.age[1]"/>
<!-- attr会从由小到大的属性从域中获取到属性:page request、值栈、session、application -->
<!-- map栈中常用的对象 request session application parameters attr -->
<s:property value="#attr.username"/>
<s:url value="" var=""></s:url>
可以用来生成一个完整URL地址,
value 指向要生成的地址,当我们的地址值以/开头,他会自动为路径加上项目名
同时它也可以自动进行URL重写
var 我们可以将生成的地址保存到域中,var来指定保存的名字。
例子:
<!--s:url标签用来创建一个完整的URL地址 -->
<!-- 也可以将url放入到域中,通过var属性来指定属性名,然后就可以通过EL表达式使用URL地址 -->
<s:url value="/index.jsp" var="url"></s:url>
${url }
<br /> <br />
<!-- action可以指定要访问的目标action的name , namespace可以用来指定action的命名空间 -->
<s:url action="user_add" namespace="/atguigu" var="url2"></s:url>
${url2 }
<br /> <br />
<!-- 还可以通过s:param标签来为地址指定请求参数 -->
<!-- param标签name属性指定属性的名字,value属性用来指定属性的值 -->
<!-- value属性会自动被OGNL解析 ,如果value属性没有解析到属性值,则请求参数不会在地址中添加 -->
<!-- 如果value属性值为数字,则不会进行OGNL解析 -->
<!-- 如果不希望value属性被ognl解析,则直接给属性值加上一个单引号 -->
<s:url action="user_add" namespace="/atguigu" var="url2">
<s:param name="username" value="username"></s:param>
<s:param name="age" value="18"></s:param>
<s:param name="gender" value="'male'"></s:param>
</s:url>
${url2 }
<s:set value="" var="" scope="" ></s:set>
set标签可以向域中添加一个属性,
value 指向属性的值,value的值会被OGNL解析
var 属性的名字
scope 属性将会被翻入到哪个域中
<!-- 可以在标签开始时将一个对象直接压入值栈的栈顶,然后在标签结束时,将对象从栈顶移除 -->
<s:push value="#request.user">
${username}
</s:push>
<!-- if elseif else -->
<s:if test="#parameters.age[0]<14">
<h3>你还是个小毛孩!</h3>
</s:if>
<s:elseif test="#parameters.age[0]<30">
<h3>你是一个精壮的汉子!</h3>
</s:elseif>
<s:else>
<h3>你已经是个老家伙了!</h3>
</s:else>
<!-- s:iterator可以用来遍历一组集合 -->
<!-- iterator标签会将集合中的每个元素,分别放入值栈的栈顶 -->
<!-- status可以用来获取当前遍历的状态 -->
<s:iterator value="#request.cities" status="st">
${st.even} --${st.index} --${st.count } -- ${id } - ${name } <br />
</s:iterator>
iterator标签用来遍历一个集合,value属性指向的一个集合,它会被ONGL解析
iterator标签会将集合中的每个元素,分别放入值栈的栈顶,我们可以直接通过属性名来读取集合
status属性可以获取到一个遍历状态的对象
even 是否是一个偶数行
odd 是否是一个奇数行
index 获取当前元素的索引
count 获取当前元素的数量
<!-- sort标签可以用来给一个集合进行排序 -->
<!-- comparator指定排序的类,source指定被排序的集合 var指定新集合的名字 -->
<s:sort comparator="#request.cc" source="#request.cities" var="cities2"></s:sort>
注意:新的集合将会被放入到page域中
<!-- a标签可以用来生成一个超链接,和HTML里a一个意思 -->
<s:a href="test">超链接1</s:a>
<br /> <br />
<s:a action="user_update" namespace="/atguigu">超链接1</s:a>
2.表单标签
<!-- s:form标签用来创建一个表单,作用和html里的form类似 -->
<!-- form标签会自动为action指向的路径加上项目名,同时默认请求方式就是post,不用手动指定 -->
<!-- 表单标签,可以自动回显 , 可以自动从值栈获取到和name属性值相同的属性的值,并在表单中回显-->
<s:form action="/testForm">
<!-- 表单隐藏域 -->
<s:hidden name="id"></s:hidden>
<!-- s:textfield用于创建一个表单文本框,name属性和表单项的name属性一样,label是表单项前边的提示文字 -->
<s:textfield name="username" label="用户名"></s:textfield>
<!--s:password 密码框 -->
<s:password name="password" label="密码"></s:password>
<!-- 你最喜欢的城市 -->
<!-- 可以为单选按钮设置一个list,list指向一个List集合或Map集合 -->
<!-- 如果是list集合,则默认使用集合的对象作为表单的value属性,和显示的文字 -->
<!-- 如果我们希望手动指定表单的value和显示的文字
则需要指定listKey和listValue
listKey指定value属性
listValue指定显示的文字
-->
<s:radio name="city" list="#request.cities" label="你最喜欢的城市" listKey="id" listValue="name"></s:radio>
<!-- 可以通过OGNL手动创建一个List 形式如下 {'male','female'} -->
<!-- 可以手动创建一个Map,那么map的key将会作为标签的value属性,而map的值,将会作为标签提示文字 -->
<s:radio label="性别" name="gender" list="#{'male':'男','female':'女'}"></s:radio>
<!-- s:checkboxlist用来创建一组多选框 -->
<s:checkboxlist label="爱好" name="hobby" list="#{'ppq':'乒乓球','lq':'篮球','ymq':'羽毛球' }"></s:checkboxlist>
<!-- s:select可以用来创建一个下拉列表 -->
<!-- headerValue可以指定默认值,headerKey指定默认值的value属性 -->
<s:select headerKey="" headerValue="请选择..." label="你最喜欢的明星" name="star" list="#{'fbb':'范冰冰','cls':'苍老师','tw':'汤唯' }">
<!--s:optgroup 可以对下拉框中的选项进行分组 -->
<s:optgroup label="女明星" list="#{'fbb':'范冰冰','cls':'苍老师','tw':'汤唯' }"></s:optgroup>
<s:optgroup label="男明星" list="#{'wyz':'吴彦祖','ldh':'刘德华','pcj':'潘长江' }"></s:optgroup>
</s:select>
<s:textarea name="desc" label="自我介绍"></s:textarea>
<!-- 当只需要上传一个boolean类型的值,这个值要不是true,要不是false,这时我们就是用 s:checkbox-->
<!-- 这个标签,当你勾选时会发送一个true作为参数,当你没勾选时会传一个false -->
<s:checkbox name="agree" label="是否同意网站协议"></s:checkbox>
<s:submit value="注册"></s:submit>
</s:form>
3.CRUD练习
查:
从数据库中加载员工信息并在页面中进行显示
emp_list
流程:
在index.jsp点击一个超链接emp_list,然后在页面中显示出类全部的员工信息
用户 –> emp_list –> Dao
删除:
根据员工的id删除员工信息
emp_del
添加:
向数据库中添加一个员工信息
emp_add
修改:
修改数据库中的一个员工信息
- 修改先查找要修改的员工的信息
emp_input
- 然后在修改员工信息
emp_update
1.创建一个Employee类
Integer id
String name
Integer age
String dept
String role
2.创建一个DAO,在DAO模拟数据库查询
3.创建UserAction,处理CRUD。