最近准备接手公司的一个老的struts项目的维护工作,所以准备在自己本地搭建一个struts的开发环境学习一下struts2项目

struts官网地址:

https://struts.apache.org/index.html

首先登陆struts官网,下载完成的struts项目作为参考。
MAC+IDEA+搭建struts2开发环境与Struts2学习心得_struts2
将下载后的文件解压,在lib目录下将会看到很多jar包文件,搭建基本的环境需要的jar包为下图:
MAC+IDEA+搭建struts2开发环境与Struts2学习心得_java_02
需要修改web.xml文件的为如下配置(这也是通过查看官网得出来的,学习的过程中查看官网太重要了!!!):

<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>

成功启动后看到该图,说明项目基本搭建成功:
MAC+IDEA+搭建struts2开发环境与Struts2学习心得_struts_03

遇到的问题总结:

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),类里的哪个方法将要执行,以及基于方法所返回的字符串结果,会呈现怎样的视图。
MAC+IDEA+搭建struts2开发环境与Struts2学习心得_struts_04
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也十分类似。
看到这里忽然发现以前一直弄不清楚的拦截器和过滤器,竟然豁然开朗了,果然书读百遍其义自现。
MAC+IDEA+搭建struts2开发环境与Struts2学习心得_拦截器_05
可以实现以下功能:
异常处理,文件上传,生命周期回调和验证。
添加拦截器的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类。