- 浏览: 21398 次
- 性别:
- 来自: 北京
文章分类
最新评论
struts2常识总结
===首先引用jar包===
早在struts2.0.*的时候,struts2的必备jar包需要如下几个:
commons-logging-*.jar Apache旗下commons项目的log日志包
freemarker-*.jar 一种前台页面模板,应用比较广泛
ognl-*.jar 动态图导航语言,struts2处理前台页面的核心语言,相当实用
struts2-core-*.jar struts2的核心包
xwork-core-*.jar webwork的核心包,因为struts2的前身是webwork,所以这个是必须的
只要满足这5个基本jar包就可以运行一个struts2的hello world
(注:*表示版本号,struts2不同版本,使用的jar包版本也可能不一样。)
但是后面版本,比如struts-2.1.8.1,必须再添加一个jar包才能运行,不然启动就会报错:
commons-fileupload-1.2.1.jar 支持文件上传的jar包
===struts.xml配置文件===
struts.xml是核心配置文件,可以实现很多基本配置以及设置Action转发跳转等操作。可以手动创建或从struts源文件()中拷贝一个struts.xml,默认放在class下(也就是你的项目源文件src目录下),当然这个配置文件的存放位置是可配的,这个稍后介绍。
下面我们看看struts.xml常用的一些配置:
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--载入默认的struts配置-->
<include file="struts-default.xml" />
<!--指定web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action-->
<constant name="struts.action.extension" value="action,do"></constant>
<!--设置浏览器是否缓存静态内容,默认值为true,生产环境下使用,开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false"></constant>
<!--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,生产环境下使用,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!--开发模式下使用,可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 是否支持通配符,默认为true -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 是否支持页面调用静态方法,默认为false 注:这个在struts2.0.*版本是默认支持调用静态方法的 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
<!--Struts2集成Spring:所有action对象有Spring来负责创建-->
<constant name="struts.objectFactory" value="spring"></constant>
<!--全局的国际化文件命名-->
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>
<package name="default" extends="struts-default">
<!-- 找不到Action时的默认跳转地址 -->
<default-action-ref name="error"/>
<action name="error">
<result>/error404.html</result>
</action>
</package>
<!-- 引用其它struts配置文件 -->
<include file="struts-*.xml"></include>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--载入默认的struts配置-->
<include file="struts-default.xml" />
<!--指定web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action-->
<constant name="struts.action.extension" value="action,do"></constant>
<!--设置浏览器是否缓存静态内容,默认值为true,生产环境下使用,开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false"></constant>
<!--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,生产环境下使用,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!--开发模式下使用,可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 是否支持通配符,默认为true -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 是否支持页面调用静态方法,默认为false 注:这个在struts2.0.*版本是默认支持调用静态方法的 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
<!--Struts2集成Spring:所有action对象有Spring来负责创建-->
<constant name="struts.objectFactory" value="spring"></constant>
<!--全局的国际化文件命名-->
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>
<package name="default" extends="struts-default">
<!-- 找不到Action时的默认跳转地址 -->
<default-action-ref name="error"/>
<action name="error">
<result>/error404.html</result>
</action>
</package>
<!-- 引用其它struts配置文件 -->
<include file="struts-*.xml"></include>
</struts>
前面已经说了,struts.xml文件默认是放在src目录下(假设现在是WEB-INF/src下),可能项目组希望把配置文件放在别的目录统一管理(假设希望放到WEB-INF/conf/struts),这样你需要在web.xml中配置struts.xml的存放路径:
Xml代码
<!-- struts2 滤镜配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../conf/struts/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts2 滤镜配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../conf/struts/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
因为struts默认路径是从src根目录下找,src和conf是同级目录,所以需要加两点".."找到src上级目录WEB-INF,然后再找conf文件。
上图为配置文件的存放目录,这里还要注意的是struts.xml里面<include>标签引用的文件路径需要改变了,因为include也是从class根下面找文件。
Xml代码
<include file="../conf/struts/struts-et.xml"></include>
<include file="../conf/struts/struts-exception.xml"></include>
<include file="../conf/struts/struts-ognl.xml"></include>
<include file="../conf/struts/struts-result.xml"></include>
<include file="../conf/struts/struts-scope.xml"></include>
<include file="../conf/struts/struts-et.xml"></include>
<include file="../conf/struts/struts-exception.xml"></include>
<include file="../conf/struts/struts-ognl.xml"></include>
<include file="../conf/struts/struts-result.xml"></include>
<include file="../conf/struts/struts-scope.xml"></include>
也许有人为问“为什么不用通配符”,很不幸的是,如果把struts.xml转移位置后,就不支持通配符了,这个我也是很郁闷。
===获得request、session、application作用域对象===
struts2有四种方式获得作用域对象:
不基于servlet容器 基于servlet容器
非IOC 通过ActionContext来获的
通过ServletActionContext和ServletActionContext来获得
采用IOC 实现RequestAware,SessionAware,ApplicationAware三个接口的抽象方法 实现ServletRequestAware,ServletContextAware这两个接口的抽象方法
这四种方式各有优劣,我用得比较多的是“基于servlet容器并实现IOC”的那种方式,在这稍微介绍一下这种用法:
Java代码
public class BaseAction extends ActionSupport implements ServletRequestAware,ServletContextAware,ServletResponseAware{
//配置序列化标志
private static final long serialVersionUID = 1L;
//request,response,application,session作用域
protected HttpServletRequest request ;
protected ServletContext application;
protected HttpServletResponse response;
protected HttpSession session;
/**
* 依赖servlet容器的IOC设置-start
*/
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
session = this.request.getSession();
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
@Override
public void setServletResponse(HttpServletResponse arg0) {
this.response = arg0;
}
/**
* 依赖servlet容器的IOC设置-end
*/
//重写execute方法
@Override
public String execute() throws Exception {
request.setAttribute("requestKey", "requestValue");
session.setAttribute("sessionKey", "sessionValue");
application.setAttribute("applicationKey", "applicationValue");
return SUCCESS;
}
}}
public class BaseAction extends ActionSupport implements ServletRequestAware,ServletContextAware,ServletResponseAware{
//配置序列化标志
private static final long serialVersionUID = 1L;
//request,response,application,session作用域
protected HttpServletRequest request ;
protected ServletContext application;
protected HttpServletResponse response;
protected HttpSession session;
/**
* 依赖servlet容器的IOC设置-start
*/
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
session = this.request.getSession();
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
@Override
public void setServletResponse(HttpServletResponse arg0) {
this.response = arg0;
}
/**
* 依赖servlet容器的IOC设置-end
*/
//重写execute方法
@Override
public String execute() throws Exception {
request.setAttribute("requestKey", "requestValue");
session.setAttribute("sessionKey", "sessionValue");
application.setAttribute("applicationKey", "applicationValue");
return SUCCESS;
}
}}
===序列化标志===
serialVersionUID作用:序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
当你创建一个Action的时候,强烈建议添加一个private static final long serialVersionUID = 1L;曾经我在跑项目的时候发现页面莫名其妙出现乱码问题,我查了数据库、项目、配置文件等等,所有的都是utf-8,但是仍然出现了乱码,后来将action设置序列化以后就好了。1L是默认的,当然你也可以自己定义。
===OGNL对象图导航语言===
OGNL是一个功能强大的EL,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。因为太过复杂,这里就简单介绍几个常用的。
假设demo1.jsp页面有姓名name,年龄age这两个表单数据,它们被提交到action(action可以访问数据库保存或者比对或者更新),然后action再转发到demo2.jsp页面显示刚才输入的数据。
这是一个典型的B/S案例,我们可以将表单数据封装到一个JavaBean中(有的人喜欢叫pojo,还有的叫vo,还有的叫formbean),到demo2.jsp的时候通过ognl表达式取出来。
demo1.jsp
Html代码
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!--添加struts2标签的引用-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="doSaveAction.action" method="post">
<s:textfield name="user.name">姓名:</s:textfield>
<s:textfield name="user.age">年龄:</s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!--添加struts2标签的引用-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="doSaveAction.action" method="post">
<s:textfield name="user.name">姓名:</s:textfield>
<s:textfield name="user.age">年龄:</s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
User.java
Java代码
public class User{
private String name;
private String age;
...get、set方法...
}
public class User{
private String name;
private String age;
...get、set方法...
} SaveAction.java
Java代码
public class SaveAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//将User这个javabean创建set方法便能获得从jsp请求过来的user对象数据
//同时user对象会放在值栈中,在demo1.jsp--SaveAction--demo2.jsp这个生命周期都存在
private User user;
public String doSave(){
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
public class SaveAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//将User这个javabean创建set方法便能获得从jsp请求过来的user对象数据
//同时user对象会放在值栈中,在demo1.jsp--SaveAction--demo2.jsp这个生命周期都存在
private User user;
public String doSave(){
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
} demo2.jsp
Html代码
<s:property value="user.name"/>
<s:property value="user.age"/>
<s:property value="user.name"/>
<s:property value="user.age"/>
之所以命名为OGNL,就是因为它处理对象很给力,struts能够将对象层层解析,把各个对象的关系以图的样式展示出来。比如user.name,之所以能找到这个对象,就是因为OGNL会先找user对象,然后再找user对象里的name对象。假设User这个类还包含了名为Role的javabean的实例,Role里面包含字段roleName,我们要找到roleName就可以直接写<s:property value="user.role.roleName">,OGNL通过对象逐级导航找到子对象。
当然OGNL也可以像jsp一样调用后台代码,不过我发现在jsp调用后台代码的效率很低,所以不是很推荐。
ognl调用静态方法的写法如下:@类全名@静态方法名,这句话等同于java代码:类全名.静态方法名
Html代码
运行静态方法:<s:property value="@com.bless.ssh2.action.OgnlAction@staticMethod()"/><br/>
运行值栈对象中的方法:<s:property value="user.method()"/><br/>
调用JDK中的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/>
运行静态方法:<s:property value="@com.bless.ssh2.action.OgnlAction@staticMethod()"/><br/>
运行值栈对象中的方法:<s:property value="user.method()"/><br/>
调用JDK中的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/> 需要注意的是,struts2.1.*默认是不允许调用静态方法的,你需要在struts.xml配置这样一句话:
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
早在struts2.0.*的时候,struts2的必备jar包需要如下几个:
commons-logging-*.jar Apache旗下commons项目的log日志包
freemarker-*.jar 一种前台页面模板,应用比较广泛
ognl-*.jar 动态图导航语言,struts2处理前台页面的核心语言,相当实用
struts2-core-*.jar struts2的核心包
xwork-core-*.jar webwork的核心包,因为struts2的前身是webwork,所以这个是必须的
只要满足这5个基本jar包就可以运行一个struts2的hello world
(注:*表示版本号,struts2不同版本,使用的jar包版本也可能不一样。)
但是后面版本,比如struts-2.1.8.1,必须再添加一个jar包才能运行,不然启动就会报错:
commons-fileupload-1.2.1.jar 支持文件上传的jar包
===struts.xml配置文件===
struts.xml是核心配置文件,可以实现很多基本配置以及设置Action转发跳转等操作。可以手动创建或从struts源文件()中拷贝一个struts.xml,默认放在class下(也就是你的项目源文件src目录下),当然这个配置文件的存放位置是可配的,这个稍后介绍。
下面我们看看struts.xml常用的一些配置:
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--载入默认的struts配置-->
<include file="struts-default.xml" />
<!--指定web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action-->
<constant name="struts.action.extension" value="action,do"></constant>
<!--设置浏览器是否缓存静态内容,默认值为true,生产环境下使用,开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false"></constant>
<!--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,生产环境下使用,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!--开发模式下使用,可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 是否支持通配符,默认为true -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 是否支持页面调用静态方法,默认为false 注:这个在struts2.0.*版本是默认支持调用静态方法的 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
<!--Struts2集成Spring:所有action对象有Spring来负责创建-->
<constant name="struts.objectFactory" value="spring"></constant>
<!--全局的国际化文件命名-->
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>
<package name="default" extends="struts-default">
<!-- 找不到Action时的默认跳转地址 -->
<default-action-ref name="error"/>
<action name="error">
<result>/error404.html</result>
</action>
</package>
<!-- 引用其它struts配置文件 -->
<include file="struts-*.xml"></include>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--载入默认的struts配置-->
<include file="struts-default.xml" />
<!--指定web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action-->
<constant name="struts.action.extension" value="action,do"></constant>
<!--设置浏览器是否缓存静态内容,默认值为true,生产环境下使用,开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false"></constant>
<!--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,生产环境下使用,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!--开发模式下使用,可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 是否支持通配符,默认为true -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 是否支持页面调用静态方法,默认为false 注:这个在struts2.0.*版本是默认支持调用静态方法的 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
<!--Struts2集成Spring:所有action对象有Spring来负责创建-->
<constant name="struts.objectFactory" value="spring"></constant>
<!--全局的国际化文件命名-->
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>
<package name="default" extends="struts-default">
<!-- 找不到Action时的默认跳转地址 -->
<default-action-ref name="error"/>
<action name="error">
<result>/error404.html</result>
</action>
</package>
<!-- 引用其它struts配置文件 -->
<include file="struts-*.xml"></include>
</struts>
前面已经说了,struts.xml文件默认是放在src目录下(假设现在是WEB-INF/src下),可能项目组希望把配置文件放在别的目录统一管理(假设希望放到WEB-INF/conf/struts),这样你需要在web.xml中配置struts.xml的存放路径:
Xml代码
<!-- struts2 滤镜配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../conf/struts/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts2 滤镜配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../conf/struts/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
因为struts默认路径是从src根目录下找,src和conf是同级目录,所以需要加两点".."找到src上级目录WEB-INF,然后再找conf文件。
上图为配置文件的存放目录,这里还要注意的是struts.xml里面<include>标签引用的文件路径需要改变了,因为include也是从class根下面找文件。
Xml代码
<include file="../conf/struts/struts-et.xml"></include>
<include file="../conf/struts/struts-exception.xml"></include>
<include file="../conf/struts/struts-ognl.xml"></include>
<include file="../conf/struts/struts-result.xml"></include>
<include file="../conf/struts/struts-scope.xml"></include>
<include file="../conf/struts/struts-et.xml"></include>
<include file="../conf/struts/struts-exception.xml"></include>
<include file="../conf/struts/struts-ognl.xml"></include>
<include file="../conf/struts/struts-result.xml"></include>
<include file="../conf/struts/struts-scope.xml"></include>
也许有人为问“为什么不用通配符”,很不幸的是,如果把struts.xml转移位置后,就不支持通配符了,这个我也是很郁闷。
===获得request、session、application作用域对象===
struts2有四种方式获得作用域对象:
不基于servlet容器 基于servlet容器
非IOC 通过ActionContext来获的
通过ServletActionContext和ServletActionContext来获得
采用IOC 实现RequestAware,SessionAware,ApplicationAware三个接口的抽象方法 实现ServletRequestAware,ServletContextAware这两个接口的抽象方法
这四种方式各有优劣,我用得比较多的是“基于servlet容器并实现IOC”的那种方式,在这稍微介绍一下这种用法:
Java代码
public class BaseAction extends ActionSupport implements ServletRequestAware,ServletContextAware,ServletResponseAware{
//配置序列化标志
private static final long serialVersionUID = 1L;
//request,response,application,session作用域
protected HttpServletRequest request ;
protected ServletContext application;
protected HttpServletResponse response;
protected HttpSession session;
/**
* 依赖servlet容器的IOC设置-start
*/
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
session = this.request.getSession();
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
@Override
public void setServletResponse(HttpServletResponse arg0) {
this.response = arg0;
}
/**
* 依赖servlet容器的IOC设置-end
*/
//重写execute方法
@Override
public String execute() throws Exception {
request.setAttribute("requestKey", "requestValue");
session.setAttribute("sessionKey", "sessionValue");
application.setAttribute("applicationKey", "applicationValue");
return SUCCESS;
}
}}
public class BaseAction extends ActionSupport implements ServletRequestAware,ServletContextAware,ServletResponseAware{
//配置序列化标志
private static final long serialVersionUID = 1L;
//request,response,application,session作用域
protected HttpServletRequest request ;
protected ServletContext application;
protected HttpServletResponse response;
protected HttpSession session;
/**
* 依赖servlet容器的IOC设置-start
*/
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
session = this.request.getSession();
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
@Override
public void setServletResponse(HttpServletResponse arg0) {
this.response = arg0;
}
/**
* 依赖servlet容器的IOC设置-end
*/
//重写execute方法
@Override
public String execute() throws Exception {
request.setAttribute("requestKey", "requestValue");
session.setAttribute("sessionKey", "sessionValue");
application.setAttribute("applicationKey", "applicationValue");
return SUCCESS;
}
}}
===序列化标志===
serialVersionUID作用:序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
当你创建一个Action的时候,强烈建议添加一个private static final long serialVersionUID = 1L;曾经我在跑项目的时候发现页面莫名其妙出现乱码问题,我查了数据库、项目、配置文件等等,所有的都是utf-8,但是仍然出现了乱码,后来将action设置序列化以后就好了。1L是默认的,当然你也可以自己定义。
===OGNL对象图导航语言===
OGNL是一个功能强大的EL,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。因为太过复杂,这里就简单介绍几个常用的。
假设demo1.jsp页面有姓名name,年龄age这两个表单数据,它们被提交到action(action可以访问数据库保存或者比对或者更新),然后action再转发到demo2.jsp页面显示刚才输入的数据。
这是一个典型的B/S案例,我们可以将表单数据封装到一个JavaBean中(有的人喜欢叫pojo,还有的叫vo,还有的叫formbean),到demo2.jsp的时候通过ognl表达式取出来。
demo1.jsp
Html代码
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!--添加struts2标签的引用-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="doSaveAction.action" method="post">
<s:textfield name="user.name">姓名:</s:textfield>
<s:textfield name="user.age">年龄:</s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!--添加struts2标签的引用-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="doSaveAction.action" method="post">
<s:textfield name="user.name">姓名:</s:textfield>
<s:textfield name="user.age">年龄:</s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
User.java
Java代码
public class User{
private String name;
private String age;
...get、set方法...
}
public class User{
private String name;
private String age;
...get、set方法...
} SaveAction.java
Java代码
public class SaveAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//将User这个javabean创建set方法便能获得从jsp请求过来的user对象数据
//同时user对象会放在值栈中,在demo1.jsp--SaveAction--demo2.jsp这个生命周期都存在
private User user;
public String doSave(){
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
public class SaveAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//将User这个javabean创建set方法便能获得从jsp请求过来的user对象数据
//同时user对象会放在值栈中,在demo1.jsp--SaveAction--demo2.jsp这个生命周期都存在
private User user;
public String doSave(){
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
} demo2.jsp
Html代码
<s:property value="user.name"/>
<s:property value="user.age"/>
<s:property value="user.name"/>
<s:property value="user.age"/>
之所以命名为OGNL,就是因为它处理对象很给力,struts能够将对象层层解析,把各个对象的关系以图的样式展示出来。比如user.name,之所以能找到这个对象,就是因为OGNL会先找user对象,然后再找user对象里的name对象。假设User这个类还包含了名为Role的javabean的实例,Role里面包含字段roleName,我们要找到roleName就可以直接写<s:property value="user.role.roleName">,OGNL通过对象逐级导航找到子对象。
当然OGNL也可以像jsp一样调用后台代码,不过我发现在jsp调用后台代码的效率很低,所以不是很推荐。
ognl调用静态方法的写法如下:@类全名@静态方法名,这句话等同于java代码:类全名.静态方法名
Html代码
运行静态方法:<s:property value="@com.bless.ssh2.action.OgnlAction@staticMethod()"/><br/>
运行值栈对象中的方法:<s:property value="user.method()"/><br/>
调用JDK中的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/>
运行静态方法:<s:property value="@com.bless.ssh2.action.OgnlAction@staticMethod()"/><br/>
运行值栈对象中的方法:<s:property value="user.method()"/><br/>
调用JDK中的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/> 需要注意的是,struts2.1.*默认是不允许调用静态方法的,你需要在struts.xml配置这样一句话:
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
发表评论
文章已被作者锁定,不允许评论。
相关推荐
struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...
在本项目总结中,我们将深入探讨Struts2的核心特性、工作原理以及如何在实际项目中应用。 一、Struts2框架基础 1. 动态方法调用(Dynamic Method Invocation,DMI):Struts2允许通过URL直接调用Action类的方法,...
struts2学习总结
根据提供的文件信息,我们可以整理出关于Struts2框架的一些关键知识点。尽管原文中的信息较为零散且不完整,但还是可以从中提炼出一些有价值的内容。接下来,我们将详细探讨这些知识点。 ### Struts2简介 Struts2...
Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...
Struts2是一个强大的Java EE应用程序框架,主要用于构建企业级的Web应用。它的核心是MVC(Model-View-Controller)设计模式,可以帮助开发者组织代码,提高开发效率,并且提供了丰富的特性来支持表单验证、国际化、...
Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试...
本总结将深入探讨Struts2的核心概念、关键功能和实用技术,以帮助开发者全面理解并熟练运用这一框架。 一、Servlet模板 在Struts2中,Servlet模板是一种处理请求和响应的方式。它通过拦截器链对请求进行处理,然后...
本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
Struts2 项目开发 Struts2 是一个基于 Java Web 的框架,广泛应用于 Web 应用程序的开发。下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目...
这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的核心功能和开发流程。下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:...
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,旨在简化创建用户交互式、数据驱动的web应用的过程。这个“Struts2接口文档”是开发者的重要参考资料,提供了关于...
### Struts2核心知识点解析 #### 一、Struts2框架概述 - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,...
### Struts1与Struts2的主要区别 #### 概述 Apache Struts 是一个用于构建企业级Java Web应用的开源框架。它分为两个版本:Struts1 和 Struts2。虽然两者都基于模型-视图-控制器(MVC)设计模式,但它们之间存在...
Struts2 最新漏洞 S2-016、S2-017 修补方案 Struts2 是一个基于 Java 的 Web 应用程序框架,由 Apache 软件基金会维护。最近,Struts2 发生了两个严重的漏洞,分别是 S2-016 和 S2-017,这两个漏洞可能会导致攻击者...
以下是对Struts2知识点的详细总结: 1. **Struts2核心组件** - **FilterDispatcher**(或现在的`StrutsPrepareAndExecuteFilter`):这是Struts2的核心过滤器,它负责拦截请求,处理Action映射,并转发到相应的...
Struts2是一个强大的Java web应用程序框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性、可扩展性良好的企业级应用的工具。这个"struts2jar.zip"压缩包包含了Struts2学习和研究的基础...
Struts2是一个强大的Java web开发框架,用于构建可维护、可扩展且结构良好的应用程序。它在MVC(Model-View-Controller)设计模式的基础上提供了一种实现方式,使得开发者能够更方便地处理用户请求,控制业务逻辑,...
该工具的打开路径为:\Struts2VulsTools-2.3.20190927\Test\bin\Release\Text.exe 2019-09-25: 优化部分EXP在部分情况下被WAF拦截的问题,提高检测成功率,优化自定义上传路径exp,文件所在目录不存在时自动创建...