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>
java:struts框架5(Converter,Validation,Tags(Object-Graph Navigation Language))的更多相关文章
- Struts_OGNL(Object Graph Navigation Language) 对象图导航语言
1.访问值栈中的action的普通属性: 请求: <a href="ognl.action?username=u&password=p">访问属性</a& ...
- Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis
https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...
- 应用于Java中的一个开源的表达式语言(Expression Language)
OGNL(英文全称:Object Graph Navigation Language,中文名:对象导航图语言)是应用于Java中的一个开源的表达式语言(Expression Language),它被集 ...
- java三大框架——Struts + Hibernate + Spring
Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...
- Java 权限框架 Shiro 实战二:与spring集成、filter机制
转自:https://www.cnblogs.com/digdeep/archive/2015/07/04/4620471.html Shiro和Spring的集成,涉及到很多相关的配置,涉及到shi ...
- JAVA web 框架集合
“框架”犹如滔滔江水连绵不绝, 知道有它就好,先掌握自己工作和主流的框架: 在研究好用和新框架. 主流框架教程分享在Java帮帮-免费资源网 其他教程需要时间制作,会陆续分享!!! 152款框架,你还 ...
- Struts框架的核心业务
Struts的核心业务 Struts核心业务有很多,这里主要介绍了比较简单一些的: 请求数据的处理,和数据自动封装,类型自动转换 1.Struts中数据处理 1.1.方式1:直接过去servletap ...
- (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)
转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入 ...
- Struts框架2ActionError类 内部资料 请勿转载 谢谢合作
ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中.ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的 ...
随机推荐
- UVA - 1640 The Counting Problem (数位dp)
题意:统计l-r中每种数字出现的次数 很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊) 从高位向低位走,设状态$(u,lim,ze)$表示 ...
- C# 计时函数(毫秒)
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading ...
- C# MVC入門
博客園已有教程,記錄一下防止遺忘,以後也可以多回顧回顧(http://www.cnblogs.com/iamlilinfeng/archive/2013/04/01/2992432.html) 使用V ...
- Oracle 表锁定
--锁表查询SQL SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$s ...
- 直接选择排序(Straight Selection Sort)
1.定义 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 常用的选择排序方法有直接选择排序和堆 ...
- idea2018.3.6安装与破解教程(亲测可用、破解到2100年)
最近,帮室友进行idea安装,之前自己安装借鉴的博客已404,在网上找了好几个都无效,想着总结一份备用. 此博客是又找了一台电脑,边安装边写的. 目录 (已安装好的,可以直接看idea2018.3.6 ...
- [CF666E]Forensic Examination:后缀自动机+线段树合并
分析 用到了两个小套路: 使用线段树合并维护广义后缀自动机的\(right\)集合. 查询\(S[L,R]\)在\(T\)中的出现次数:给\(T\)建SAM,在上面跑\(S\),跑到\(R\)的时候先 ...
- sublime text 3设置
Sublime text 3 中文文件名显示方框怎么解决? 如图,中文文件名打开全是乱码,内容倒是装了converttoutf8没什么太大的问题. 作者:凝空虚步链接:https://www.zhih ...
- Atcoder ARC101 E 树dp
https://arc101.contest.atcoder.jp/tasks/arc101_c 题解是也是dp,好像是容斥做的,但是看不懂,而且也好像没讲怎么变n^2,看了写大佬的代码,自己理解了一 ...
- Java容器——Set和顺序存储
当Set使用自己创建的类型时,存储的顺序如何维护,在不同的Set实现中会有不同,而且它们对于在特定的Set中放置的元素类型也有不同的要求: Set(interface) 存入Set的每个元素都必须是唯 ...