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>

 

 

  

  

  

posted @ 2017-08-13 22:32  咫尺天涯是路人丶  阅读(299)  评论(0编辑  收藏  举报