1.Struts 2提供了非常强大的类型转换功能,提供了多种内置类型转换器,也支持开发自定义类型转换器
2.Struts 2框架使用OGNL作为默认的表达式语言

==========================================OGNL=================================
OGNL:Object Graph Navigation Language
    1.取代页面中Java脚本,简化数据访问
    2.和EL一样是表达式语言,功能更强大
    
功能和特点:
    1.能存取对象的属性,也能调用对象的方法
    2.能访问静态方法、静态属性
    3.能访问值栈及StackContext
    4.能操作集合对象
    5.支持赋值、运算操作、字段类型转化

语法:
    1.导入taglib指令:<%taglib uri="/struts-tags" prefix="s" %>
    2.<s:property value="OGNL表达式"/> --> 在JSP中显示OGNL表达式的值
    
作用:
    1.表达式语言
        将表单或者Struts2标签与特定的Java数据库绑定起来,用来将数据移入,移除框架
    2.类型转换
        数据进入和流出框架,在页面数据的字符串类型和Java数据类型之间进行转换
        
值栈:ValueStack(可理解为存储数据的Map)
    1.由Struts2框架创建的存储区域,具有栈的特点
    2.Action的实例会被存放到值栈中
【注意:值栈中内容可以直接访问,访问非值栈对象需要添加#前缀】
    
OGNL访问ValueStack
    1.按照从上到下的顺序
    2.靠近栈顶的同名属性会被读取
    
访问Bean的属性
    1.Bean的类型必须遵循JavaBean规范--必须具有无参构造
    2.setter和getter方法符合JavaBean规范
    
访问集合对象
    1.可以使用属性名[index]的方式访问        如:列表,数值
    2.可以使用属性名[key]的方式访问            如:Map对象
    3.使用size或者length获取集合长度
    
==========================================URL标签=================================
使用Struts 2使用URL标签可以构建一个超链接

语法:
<s:url value="url" />
    <s:param name="parname"  value="parvalue" />
</s:url>

value属性:表示指定生成URL的地址
<s:param />:表示需要传递的参数信息
    name属性:表示传递的参数名称
    value属性:表示传递参数所具有的值
    
==========================================日期标签=================================    
使用Struts 2日期标签可以实现日期输出的格式化显示

<s:date format="format"  nice="true|false"  name="name" >
           ……
</s:date>

format:指定格式进行日期格式化
nice:    指定是否输出指定日期和当前时间的时间差,默认false
name:当前需要格式化的日期
    
==========================================类型转换=================================        
基于HTTP协议的Web应用中:
    1.客户端请求的所有内容都以编码方式传输到服务器端
    2.服务器端的编程语言有丰富的数据类型
    
内置类型转换器:自动对客户端传来的数据进行类型转换(除Servlet手动转换外)
        内置类型转换器                    说    明
            String            将int、long、double、boolean、String类型的数组或者java.util.Date类型转换为字符串
            boolean/Boolean    在字符串和布尔值之间进行转换
            char/Character    在字符串和字符之间进行转换
            date            在字符串和日期类型之间进行转换。具体输入输出格式与当前的Locale相关
            数组和集合        在字符串数组和数组对象、集合对象间进行转换
    
创建自定义类型转换器
    1.继承StrutsTypeConverter抽象类(org.apache.struts2.util. StrutsTypeConverter)
    2.应用于全局范围的类型转换器
        在src目录创建xwork-conversion.properties --> 转换类全名=类型转换器类全名
    3.应用于特定类的类型转换器
        在特定类的相同目录下创建一个名为ClassName-conversion.properties的属性文件 --> 特定类的属性名=类型转换器类全名

处理类型转换错误
    1)向用户输出类型转换错误的前提条件
        1.启动StrutsConversionErrorInterceptor拦截器
            拦截器已经包含在defaultStack拦截器栈中
        2.Action要继承ActionSupport类
            实现ValidationAware接口
        3.配置input结果映射
        4.页面使用Struts 2表单标签或<s:fielderror>标签
            a.Struts 2表单标签内嵌输出错误信息功能
            b.普通HTML标签需使用<s:fielderror>标签输出转换错误
    2)修改所有类型的转换错误信息
        修改xwork.default.invalid.fieldvalue键的值
            步骤:
                1.在struts.xml中指定资源文件的基名 -- <constant name="struts.custom.i18n.resources" value="message"/>
                2.在src目录下创建资源文件并修改键值 -- xwork.default.invalid.fieldvalue=字段"{0}"的值无效
    3)定制特定字段的类型转换错误信息
        在Action范围的资源文件中添加I18N消息键invalid.fieldvalue.xxx
            在Action包下创建RegisterAction.properties,指定键值 -- invalid.fieldvalue.birthday=生日转换错误

范例:
1.实体类 -- User

 package com.Elastic.StrutsDemo4.ivy.entity;
public class User {
private String loginName;
private String loginPass; public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPass() {
return loginPass;
}
public void setLoginPass(String loginPass) {
this.loginPass = loginPass;
}
}

2.test包 -- Test

 package com.Elastic.StrutsDemo4.ivy.test;

 import com.Elastic.StrutsDemo4.ivy.entity.User;

 import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException; public class Test { public static void main(String[] args) throws OgnlException {
User user = new User();
//使用OGNL表达式赋值
Ognl.setValue("loginName", user, "张三");
System.out.println(user.getLoginName()); User user2 = new User();
//创建上下文环境
OgnlContext ognlContext = new OgnlContext();
ognlContext.put("user", user);
ognlContext.put("msg", user2);
//设置根对象 -- user
ognlContext.setRoot(user); /*Ognl.setValue("user.loginPass", ognlContext, "abc123");
System.out.println(user.getLoginPass());
System.out.println(user2.getLoginName());
Ognl.setValue("msg.loginName", ognlContext, "admin123");
System.out.println(user2.getLoginName());*/ //ActionContext中包含多个对象。如果使用OGNL访问根对象,可直接书写对象的属性,而要使用其他对象必须使用"#key"前缀来访问
Ognl.setValue("loginName", ognlContext, ognlContext.getRoot(), "李四");
System.out.println(user.getLoginName()); Ognl.setValue("#msg.loginName", ognlContext, ognlContext.getRoot(), "王五");
System.out.println(user2.getLoginName());
}
}

3.action包
a.UserAction

 package com.Elastic.StrutsDemo4.ivy.action;

 import java.util.Date;
import java.util.HashMap;
import java.util.Map; import com.Elastic.StrutsDemo4.ivy.entity.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport { private User user;
private String[] strs;
private Map<String, Object> map;
private Date regDate;
private Integer age; public Map<String, Object> getMap() {
return map;
} public void setMap(Map<String, Object> map) {
this.map = map;
} public Date getRegDate() {
return regDate;
} public void setRegDate(Date regDate) {
this.regDate = regDate;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String[] getStrs() {
return strs;
} public void setStrs(String[] strs) {
this.strs = strs;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String regPage() {
user = new User();
user.setLoginName("admin");
strs = new String[3];
strs[0] = "test";
strs[1] = "abc"; map = new HashMap<String, Object>();
map.put("admin", "123456"); return SUCCESS;
} public String index(){
return SUCCESS;
}
}

b.UserAction-conversion.properties

 regDate=com.Elastic.StrutsDemo4.ivy.util.DateConvert

c.UserAction.properties

 invalid.fieldvalue.regDate=\u65E5\u671F\u683C\u5F0F\u65E0\u6548

4.util包
a.DateConvert

 package com.Elastic.StrutsDemo4.ivy.util;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map; import javax.management.RuntimeErrorException; import org.apache.struts2.util.StrutsTypeConverter; public class DateConvert extends StrutsTypeConverter{
SimpleDateFormat[] formats = new SimpleDateFormat[]{
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy.MM.dd")
}; /**
* 将一个或多个字符串值转换为指定的类型
*/
@Override
public Object convertFromString(Map arg0, String[] values, Class arg2) {
Object value = null;
for (SimpleDateFormat format : formats) {
try {
value = format.parse(values[0]);
} catch (ParseException e) {
e.printStackTrace();
}
}
if (values[0].length() != 0 && value == null) {
throw new RuntimeException("");
}
return value;
} /**
* 将指定对象转化为字符串
*/
@Override
public String convertToString(Map arg0, Object arg1) {
return null;
}
}

5.Struts配置文件 -- 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>
<constant name="struts.custom.i18n.resources" value="message"></constant>
<package name="default" namespace="/" extends="struts-default"> <action name="regPage" class="com.Elastic.StrutsDemo4.ivy.action.UserAction" method="regPage">
<result name="success">/reg.jsp</result>
<result name="input">/index.jsp</result>
</action> <action name="index" class="com.Elastic.StrutsDemo4.ivy.action.UserAction" method="index">
<result name="success">/reg.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>

6.xwork-conversion.properties

 java.util.Date=com.Elastic.StrutsDemo4.ivy.util.DateConvert

7.errormsg.properties

 xwork.default.invalid.fieldvalue=\u5B57\u6BB5{0}\u683C\u5F0F\u65E0\u6548

8.web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>StrutsDemo4_ivy</display-name>
<welcome-file-list>
<welcome-file>regPage</welcome-file>
</welcome-file-list> <filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

9.jsp
a.reg.jsp

 <%-- 引入JSP页面PAGE指令 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- 引入JSTL标签指令 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%-- 引入Struts标签指令 --%>
<%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html>
<html language="zh-CN">
<head>
<meta charset="utf-8">
<!-- 设置浏览器渲染的引擎 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置支持移动设备 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>网页标题</title>
<!-- 引用bootstrap样式 -->
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css">
</head>
<body>
<div class="container-fluid">
<s:debug></s:debug>
<s:property value="user.loginName" />
<s:property value="strs[1]" />
<s:property value="map['admin']" /> <s:property value="{123,44,56,78}[1]"/>
<s:property value="#{'name':'admin','pass':'123456' }['pass']"/> <s:iterator value="strs" var="s">
<h1><s:property value="s"/></h1>
</s:iterator> <s:property value="#parameters['test']"/> <!-- struts标签显示url地址 -->
<a href="<s:url action="regPage">
<s:param name="name" value="admin"></s:param>
</s:url>">链接</a> <!-- includeParams 包含前一次请求的参数 -->
<s:url value="reg.jsp" includeParams="all">
<s:param name="admin">test</s:param>
</s:url>
<s:url value="login.jsp">
<s:param name="loginName" value="ognl表达式">直接书写值</s:param>
<s:param name="loginPass" value="ognl表达式">直接书写值</s:param>
</s:url> <!-- 显示日期 -->
<s:property value="regDate"/>
<s:date name="regDate" format="yyyy-MM-dd hh:mm:ss"/>
<h1><s:date name="regDate" nice="true"/></h1>
<s:fielderror name="regDate"></s:fielderror> <fmt:formatDate value="${regDate }" pattern="yyyy年MM月rr日hh时mm分ss秒"/> <br><s:property value="age"/> </div> <!-- 引用外部JS文件 -->
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> </body>
</html>

b.index.jsp

 <%--引入JSP页面PAGE指令 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- 引入JSTL标签指令 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html language="zh-CN">
<head>
<meta charset="utf-8">
<!-- 设置浏览器渲染的引擎 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 设置支持移动设备 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>首页</title>
<!-- 引入bootstrap的样式 -->
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css">
</head>
<body>
<s:debug></s:debug>
<div class="container">
<form action="index">
<input name="regDate" type="text">
<s:fielderror name="regDate"></s:fielderror>
<input type="submit" value="提交">
</form>
</div> <!-- 引入JS的样式 -->
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> </body>
</html>

服务器报错:
1.框架中如果没用用Spring框架,那么一定不要添加Spring的jar包。因为Spring是自动加载,如果没有用Spring,它也会加载Spring的jar包。此时,若没用Spring,那么服务器会报错
2.当服务器报多个cause by 时,从最后一条cause by 开始找原因

Struts(四)的更多相关文章

  1. struts (四) path DMI

    1.path 常使用绝对路径 path = request.getContextPath(); basepath = request.getscheme+"://"+request ...

  2. shh(struts+spring+Hibernate)的搭建

    一.Struts 一.struts的流程 (1)首先,用户在地址栏中输入你的项目访问路径,然后这个请求会发送到服务器,服务器先找到要web.xml的,给web.xml中配置了一个filter过滤器,过 ...

  3. Struts+Hibernate+Spring实现用户登录功能

    通过登录案例实现三大框架之间的整合,登录功能是任何系统和软件必不可少的一个模块,然而通过这个模块来认识这些复杂的框架技术,理解数据流向和整个设计思路是相当容易的.只有在掌握了这些小模块的应用后,才能轻 ...

  4. struts 在Action中访问web元素(request,session等)

    出发jsp: <?xml version="1.0" encoding="GB18030" ?> <%@ page language=&quo ...

  5. java痛苦学习之路[四]---关于struts2-convention-plugin使用

    一.struts2-convention-plugin配置文件具体解释 <constant name="struts.convention.actionConfigBuilder&qu ...

  6. Struts2配置Result(Struts2_result)

    一.概要 二.常用四种类型的配置 Struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!D ...

  7. 补交作业-第八周PSP

    一.表格 C(分类) C(内容) S(开始时间) ST(结束时间) I(打断时间) △(净工作时间) 讨论 用户界面 9:30 10:40 15 55 编码 编码 13:20 16:30 10 180 ...

  8. Struts2整合Hibernate3实现用户登录功能

    所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...

  9. Struts2(十二)使用验证框架验证数据较验

    一.数据验证 1.1.为什么要进行数据验证 对数据的合法性进行检查,只允许合法的数据进入应用程序 1.2.在哪里实现数据验证 客户端验证: 数据提交前在客户端验证 可使用JavaScript或者JQu ...

随机推荐

  1. CompositePattern(组合模式)-----Java/.Net

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  2. Dockerfile + Nginx.conf文件记录(用于前端项目部署)

    Dockerfile + Nginx.conf文件记录(用于前端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理),默认服 ...

  3. 【转】出现“ValueError : numpy.ufunc has the wrong size, try recompiling" 解决方法

    出现这个问题的原因是:numpy版本和scikit-learn版本不搭配. 解决方法: 升级numpy即可: pip install -U numpy

  4. FUTABA舵机参数大全

    S9150 Digital servo 尺寸:47.5X27X25.3mm 重量:53g 速度:0.18sec/60"(4.8V) 扭力:5.8kg:cm(4.8V) ——————————— ...

  5. Asp.Net Core 学习教程1、初始.Net Core与VS Code 第一个web程序

    1..Net Core介绍 .NET Core是.NET Framework的新一代版本, 是微软开发的第一个具有跨平台(Windows.Macosx.Linux) 能力的应用程序开发框架,未来也将会 ...

  6. 如何使用poi在word表格中插入行的4种方法

    本文记录了,在word表格中插入新行的几种方法.直接上代码说明 table.addNewRowBetween 没实现,官网文档也说明,只有函数名,但没具体实现,但很多文章还介绍如何使用这个函数,真是害 ...

  7. redis订阅发布简单实现

    适用场景 业务流程遇到大量异步操作,并且业务不是很复杂 业务的健壮型要求不高 对即时场景要求不高 原理介绍 redis官网文档:https://redis.io/topics/notification ...

  8. 求二叉树的深度,从根节点到叶子节点的最大值,以及最大路径(python代码实现)

    首先定义一个节点类,包含三个成员变量,分别是节点值,左指针,右指针,如下代码所示: class Node(object): def __init__(self, value): self.value ...

  9. 递推 dp - 求有多少个序列符合题意

    题目描述     小美有一个由n个元素组成的序列{a1,a2,a3,...,an},她想知道其中有多少个子序列{ap1,ap2,...,apm}(1 ≤ m ≤ n, 1 ≤ p1 < p2 , ...

  10. ORM基础2 字段及其参数和meta

    一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...