java:struts框架5(Converter,Validation,Tags(Object-Graph Navigation Language))
1.Converter:
struts.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="converterDemo" extends="struts-default"> <action name="point-*" class="cn.zzsxt.action.MyPointAction" method="{1}"> <result name="success">/success.jsp</result> </action> </package> </struts>
Conversion:
package cn.zzsxt.conversion; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import cn.zzsxt.entity.MyPoint; public class MyPointConverter extends StrutsTypeConverter { /** * 10,20 * 将字符串转换为复合类型 * context:上下文 * values:参数的值 * toType:目标类型 */ @Override public Object convertFromString(Map context, String[] values, Class toType) { if(toType==MyPoint.class){ String value = values[0];//获取坐标的值: 10,20 String[] arr = value.split(",");//arr = {"10,20"} //获取x坐标的值 int x = Integer.parseInt(arr[0]); int y = Integer.parseInt(arr[1]); MyPoint myPoint = new MyPoint(); myPoint.setX(x); myPoint.setY(y); return myPoint; } return null; } /** * 将复合类型转换为字符串 */ @Override public String convertToString(Map arg0, Object arg1) { return null; } }
action:
package cn.zzsxt.action; import com.opensymphony.xwork2.ActionSupport; import cn.zzsxt.entity.MyPoint; public class MyPointAction extends ActionSupport { private MyPoint point; public MyPoint getPoint() { return point; } public void setPoint(MyPoint point) { this.point = point; } public String add() throws Exception { System.out.println("执行了add方法,坐标为:"+point); return this.SUCCESS; } }
action包下properties文件(简单类型):
point=cn.zzsxt.conversion.MyPointConverter
src下properties文件(复合类型):
cn.zzsxt.entity.MyPoint=cn.zzsxt.conversion.MyPointConverter
index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> <form action="point-add.action" method="post"> 请输入坐标(x,y)<input type="text" name="point"><br> <input type="submit" value="提交"> </form> </body> </html>
success.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> x=${point.x}<br> y=${point.y}<br> </body> </html>
2.Validation(简单类型和复合类型验证,单一方法和全体方法验证(起名格式)):
validators声明文件这里找:
这里找验证规则:com.opensymphony.xwork2.validator.validators.default.xml
struts-2.3.32-all源文件\struts-2.3.32\docs\docs\index.html这里找学习指南:
struts.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="validationDemo" extends="struts-default"> <action name="user-*-*" class="cn.zzsxt.action.UserAction" method="{1}"> <result name="success">/index.jsp</result> <result name="input">/{2}.jsp</result> //此处 name=“input”固定写法不能更改,{2}灵活展现页面 </action> <action name="user2-*" class="cn.zzsxt.action.UserAction2" method="{1}"> <result name="success">/index.jsp</result> <result name="input">/register2.jsp</result> </action> </package> </struts>
UserAction(简单类型):
package cn.zzsxt.action; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport{ private String userName; private String userPass; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPass() { return userPass; } public void setUserPass(String userPass) { this.userPass = userPass; } /** * 登陆 * @return * @throws Exception */ public String doLogin() throws Exception { System.out.println("执行了login方法...."); return this.SUCCESS; } /** * 注册 * @return * @throws Exception */ public String doRegister() throws Exception { System.out.println("执行了register方法,新增了用户:"+userName); return this.SUCCESS; } /** * validateXxx方法:Xxx为需要校验的方法名 * 只针对Action中指定的方法进行校验。 */ // public void validateDoregister() { // //用户名不能为空,并且长度不能小于6位 // if(userName==null||userName.equals("")){ // this.addFieldError("userName", "用户名不能为空!"); // } // if(userName.length()<6){ // this.addFieldError("userName", "用户名长度不能小于6位!"); // } // //密码不能空,密码的长度等于6位 // if(userPass==null||userPass.equals("")){ // this.addFieldError("userPass", "密码不能为空!"); // } // if(userPass.length()<6){ // this.addFieldError("userPass", "用户名长度不能等于6位!"); // } // } /** * validate()会真的该action中所有的方法进行校验 */ // public void validate() { // //用户名不能为空,并且长度不能小于6位 // if(userName==null||userName.equals("")){ // this.addFieldError("userName", "用户名不能为空!"); // } // if(userName.length()<6){ // this.addFieldError("userName", "用户名长度不能小于6位!"); // } // //密码不能空,密码的长度等于6位 // if(userPass==null||userPass.equals("")){ // this.addFieldError("userPass", "密码不能为空!"); // } // if(userPass.length()<6){ // this.addFieldError("userPass", "用户名长度不能等于6位!"); // } // } }
action包下UserAction-validation.xml(简单类型验证):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <field name="userName"> <!--字符串必填校验器 --> <field-validator type="requiredstring"> <!-- 去掉前后空格 --> <param name="trim">true</param> <message>用户名不能为空!</message> </field-validator> <!-- 字符串长度校验器 --> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">10</param> <message>用户名长度必须在${minLength}和${maxLength}之间!</message> </field-validator> </field> <field name="userPass"> <field-validator type="requiredstring"> <message>密码不能为空!</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">6</param> <message>密码长度必须是${minLength}位!</message> </field-validator> </field> </validators>
action包下UserAction2-validation.xml(复合类型验证):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <field name="user"> <field-validator type="visitor"> <param name="context">myContext</param> <param name="appendPrefix">true</param> <message>此处随便写?</message> </field-validator> </field> </validators>
entity包下的User-myContext-validation.xml(复合类型验证):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <field name="userName"> <field-validator type="requiredstring"> <message>用户名不能为空!</message> </field-validator> </field> <field name="userPass"> <field-validator type="requiredstring"> <message>密码不能为空!</message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <message>年龄必须在${min}-${max}之间!</message> </field-validator> </field> <field name="email"> <field-validator type="requiredstring"> <message>电子邮箱不能为空!</message> </field-validator> <field-validator type="email"> <message>电子邮件格式有误!</message> </field-validator> </field> <field name="phone"> <field-validator type="regex"> <param name="regex"><![CDATA[^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$]]></param> <message>手机号码有误!</message> </field-validator> </field> </validators>
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>用户注册</title> </head> <body> <s:fielderror></s:fielderror> <form action="user-doLogin-login.action" method="post"> 用户名:<input type="text" name="userName"/><br> 密码:<input type="text" name="userPass"/><br> <input type="submit" value="登录"/> </form> </body> </html>
register.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>用户注册</title> </head> <body> <s:fielderror></s:fielderror> <form action="user-doRegister-register.action" method="post"> 用户名:<input type="text" name="userName"/><br> 密码:<input type="text" name="userPass"/><br> <input type="submit" value="提交"/> </form> </body> </html>
register2.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>用户注册</title> </head> <body> <s:fielderror></s:fielderror> <form action="user2-doRegister.action" method="post"> 用户名:<input type="text" name="user.userName"/><br> 密码:<input type="text" name="user.userPass"/><br> 年龄:<input type="text" name="user.age"/><br> 电子邮箱:<input type="text" name="user.email"/><br> 手机:<input type="text" name="user.phone"/><br> <input type="submit" value="注册"/> </form> </body> </html>
3.Tags:(OGNL(Object-Graph Navigation Language对象图导航语言,类似EL表达式))
#paramters---------->request.getParameterValues("xx");
#request.name----->request.getAttribute("name");
#session.name----->session.getAttribute("name");
#application.name-->applocation.getAttribute("name");
.......
generic.jsp:
<%@ page language="java" import="java.util.*,cn.zzsxt.entity.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'ui.jsp' starting page</title> </head> <body> <% int age=40; request.setAttribute("age", age); %> if/elseif/else标签: <s:if test="#request.age<18"> 未成年! </s:if> <s:elseif test="#request.age>=18&&#request.age<=30"> 青年! </s:elseif> <s:else> 老年! </s:else> <hr> <% List<User> list = new ArrayList<User>(); for(int i=0;i<5;i++){ User user = new User(); user.setUserId(i+1); user.setUserName("username"+i); user.setUserPass("userpass"+i); list.add(user); } session.setAttribute("list", list); %> iterator标签:类似c标签库中forEach标签<br> <s:iterator value="#session.list" var="user"> <%-- ${user.userId}***${user.userName}***${user.userPass}<br> --%> <s:property value="#user.userId"/>---<s:property value="#user.userName"/>---<s:property value="#user.userPass"/><br> </s:iterator> <hr> 需求:奇数行显示红色,偶数行显示绿色<br> <s:iterator value="#session.list" var="user" status="st"> <!-- 奇数行 --> <s:if test="#st.index%2==0"> <font color="red"> <s:property value="#st.index"/>--<s:property value="#user.userId"/>---<s:property value="#user.userName"/>---<s:property value="#user.userPass"/><br> </font> </s:if> <s:else> <font color="green"> <s:property value="#st.index"/>--<s:property value="#user.userId"/>---<s:property value="#user.userName"/>---<s:property value="#user.userPass"/><br> </font> </s:else> </s:iterator> <hr> <% Date now = new Date(); application.setAttribute("now", now); %> date标签:对日期处理<br> <s:date name="#application.now" format="yyyy年MM月dd日 HH:mm:ss"/> </body> </html>
ui.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'ui.jsp' starting page</title> </head> <body> <s:form action="user-doRegister" method="post"> <s:textfield name="user.userName" label="用户名"></s:textfield> <s:password name="user.userPass" label="密码"></s:password> <s:radio list="{'男','女'}" name="user.sex" label="性别(使用OGNL动态构建List)"></s:radio> <s:radio list="#{1:'男',0:'女'}" name="user.sex2" label="性别(使用OGNL动态构建Map)"></s:radio> <s:checkboxlist list="{'吃饭','睡觉','打豆豆'}" name="user.loves" label="爱好(List)"></s:checkboxlist> <s:checkboxlist list="#{1:'吃饭',2:'睡觉',3:'打豆豆'}" name="user.loves2" label="爱好(Map)"></s:checkboxlist> <s:select list="{'JAVA1','JAVA2'}" name="user.clazz" label="班级(List)"></s:select> <s:select list="#{1:'JAVA1',2:'JAVA2'}" name="user.clazz2" label="班级(Map)"></s:select> <s:textarea name="user.note" label="个人说明" cols="40" rows="4"></s:textarea> <s:submit value="注册"></s:submit> </s:form> </body> </html>