最近准备接手公司的一个老的struts项目的维护工作,所以准备在自己本地搭建一个struts的开发环境学习一下struts2项目
struts官网地址:https://struts.apache.org/index.html
首先登陆struts官网,下载完成的struts项目作为参考。
将下载后的文件解压,在lib目录下将会看到很多jar包文件,搭建基本的环境需要的jar包为下图:
需要修改web.xml文件的为如下配置(这也是通过查看官网得出来的,学习的过程中查看官网太重要了!!!):
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
成功启动后看到该图,说明项目基本搭建成功:
1、Javassist library is missing in classpath! Please add missed dependency!
解决方法:因为引入的时候,少了一个javassist的jar引起的报错,将对应的jar包引入就好了。
2、ERROR DomHelper 元素类型为 “struts” 的内容必须匹配 “(package|include|bean|constant)*”。 at (null:11:10)
解决方法:添加如下配置
<struts>
<!-- <constant name="struts.devMode" value="true"></constant>-->
<package name="helloworld" extends="struts-default">
<action name="hello" class="com.ysy.HelloWorldAction" method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
3、ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console…
解决方法:项目中只有log4j-api.jar,下载log4j-core.jar并且添加进去项目中后,问题解决。
4、s:url中的id属性无效
<s:url id="indexEN" namespace="/" action="locale">
<s:param name="request_locale">en</s:param>
</s:url>
解决方法:版本中的id属性取消,修改为了var属性
5、国际化时无法读取properties中的内容
解决方法:struts.xml中添加如下配置。
<!--实现国际化的配置文件-->
<constant name="struts.custom.i18n.resources" value="global"></constant>
intellij idea把目录加到classpath中
知识要点总结映射关系
struts的关键作用就是一把URL、HelloWorldAction类(模型)以及 HelloWorld.jsp(视图)联系在一起。告知Struts2 框架哪个类将响应用户的动作(URL),类里的哪个方法将要执行,以及基于方法所返回的字符串结果,会呈现怎样的视图。
Struts配置如下:
<struts> <!-- <constant name="struts.devMode" value="true"></constant>-->
<package name="helloworld" extends="struts-default">
<action name="hello" class="com.ysy.HelloWorldAction" method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package> </struts>
**在配置文件中将action的名字命名为“hello”,同时在index.jsp中,form表单中的action的name也为“hello”,这就形成了一种映射关系。**同时,form中的值可以传递给action类。
<form action="hello">
<label for="name">Please enter your name</label><br/>
<input type="text" name="name">
<input type="submit" value="say Hello">
</form>
index页面中的form表单提交之后,根据action的name,到struts中查找对应的类和方法,本示例中执行的类为class=“com.ysy.HelloWorldAction” method=“execute”;
public class HelloWorldAction {
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
调用该类,执行execute方法后,返回“success”字符串对应的JSP页面。
返回的字符串和jsp页面也形成了一种映射关系。
web.xml
web.xml配置文件是一种J2EE配置文件,决定servlet容器的HTTP元素需求如何进行处理。****它严格来说不是一个Struts2 配置文件,但它是Struts2 运作所需要进行配置的文件。Struts2 应用程序的接入点将会定义为一个过滤器。
action的作用
第一,action可以将数据传递到页面中去; 第二,action必须协助框架确定哪个结果应该呈现在响应请求的视图中。
拦截器
**拦截器在概念上与servlet过滤器或JDK代理类相同。**与Spring中的AOP也十分类似。
看到这里忽然发现以前一直弄不清楚的拦截器和过滤器,竟然豁然开朗了,果然书读百遍其义自现。
可以实现以下功能:
异常处理,文件上传,生命周期回调和验证。
添加拦截器的struts.xml配置:
<struts> <!-- <constant name="struts.devMode" value="true"></constant>-->
<package name="helloworld" extends="struts-default">
<!-- 注册自己的拦截器-->
<interceptors>
<interceptor name="myinterceptor" class="com.ysy.MyInterceptor"></interceptor>
</interceptors>
<action name="hello" class="com.ysy.HelloWorldAction" method="execute">
<!--系统已经实现的拦截器-->
<interceptor-ref name="params"></interceptor-ref>
<interceptor-ref name="timer"></interceptor-ref>
<!--自定义拦截器-->
<interceptor-ref name="myinterceptor"></interceptor-ref>
<result name="success">/HelloWorld.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
OGNL
OGNL基于上下文中存有根对象或默认对象的理念,使用标记符号(即#号)来引用默认或根对象的属性。
**Action对象在值栈中总是可用的,因此如果你的Action对象有x和y属性,你可以随时使用。**因为我的Action中有name属性,所以可以直接用。
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World,<s:property value="name"/>
</body>
</html>
struts2验证框架
验证是如何进行的?
当用户按下提交按钮时,Struts2 将自动执行validate方法,如果方法中列出的任何if语句为真,Struts2 将调用addFieldError方法。如果添加了任何错误信息,Struts2 将不会调用execute方法,并且返回"input"。如果所有的验证都通过,则接着调用execute()方法。
</action>
<action name="empinfo" class="com.ysy.Employee" method="execute">
<result name="input">/employee.jsp</result>
<result name="success">/Success.jsp</result>
</action>
本地化/国际化
Struts2使用bundle资源束、拦截器和标签库提供本地化,即国际化(i18n)支持,主要用在以下几个地方:
(1)UI标签
(2)信息和错误。
(3)Action类。