一、基础使用
使用struts2.5.10
1、配置Struts2 与 简单使用
(1)、导包。通过实践,Struts 2.5.10必须导入的包如下:(其实在某个名为min-struts.xml 中所列的就是必须的jar包)
注:其中log4j-api-**.jar 不同于普通的log4j -**.jar,所以只能导入struts 中的该日志包,但common-logging-**.jar应该是相同的。
(2)、配置web.xml。两种方式使用struts。
<!-- 通过struts的StrutsServlet 类管理,不推荐,但适用于业务是特定的情况 -->
<servlet>
<servlet-name>strutsServlet</servlet-name>
<servlet-class>org.apache.struts2.dispatcher.servlet.StrutsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>strutsServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 通过struts的StrutsPrepareAndExecuteFilter 类管理,推荐方法-->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="myPackage" extends="struts-default" >
<action name="first">
<result>/loginOn.jsp</result>
</action>
</package>
</struts>
注:action 的name属性值最后作为访问的url,访问基础格式:first.action。映射到loginOn.jsp
4、编写页面,通过struts2 实现简单跳转
index.jsp中:
<a href="first.action">first.action请求struts2</a>
说明:访问struts2的name 为first 的action。也即访问到映射的loginOn.jsp页面。
2、新手常见问题
常遇到错误:There is no Action mapped for namespace / and action name
常见原因:
(1)、struts.xml文件名错误。一定要注意拼写问题(自己就一直认为是Structs ...);
(2)、struts.xml文件放置路径错误。一定要将此文件放置在src目录下。编译成功后,要确认是否编译到classes目录中;
(3)、struts.xml文件内容错误。尤其是 声明部分,正确配置参考:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
说明:其中的版本号保留2位,所以不同版本的struts,在此基础上改版本号即可。
参考:
(1)、There is no Action for namespace / and..问题总结
(2)、DOCTYPE 声明标准
DOCTYPE 标准格式:
<!DOCTYPE rootElementName PUBLIC "PublicIdentifier" "URIreference">
其中publicIdentifier 格式如下,URIreference 为标签定义文件位置。
DTD名称格式为"注册//组织//类型 标签//语言"
二、Struts 2 的Action 对象
struts1 中,所有控制器都继承 org.apache.struts.action.Action 类。
struts2 中,有所改变:存在于core jar文件的com.opensymphony.xwork2包中。下面的记录都是关于struts2 的。
1、Action 接口
该接口定义了5个常量与execute 方法。常量分别为:SUCCESS、NONE、INPUT、LOGIN、ERROE,常量表示请求结果,并作为返回哪个页面的一个判断条件。
execute 方法便是返回这几个值中的某个,表明当前action 请求状态。
各常量值含义:
SUCCESS:
The action execution was successful. Show result view to the end user.成功并返回一个页面
NONE:
The action execution was successful but do not show a view. This is useful for actions that are handling the view in another fashion like redirect.成功但不返回页面。
INPUT:
This result is also used if the given input params are invalid, meaning the user should try providing input again.与输入有关的请求失败,如输入不合法、输入不全等。
LOGIN:
The action could not execute, since the user most was not logged in. The login view should be shown.用户未登陆,无法执行action
ERROR:
The action execution was a failure.Show an error view, possibly asking the user to retry entering data.执行action 失败,展示失败页面
2、应用动态Action
所谓动态action,就是一个Action 对象(表示某类业务)中有中几个方法,每次决定请求哪个具体方法。
(1)、简单实践:PlainAction.java
package com.milan.actions;
import com.opensymphony.xwork2.ActionSupport;
public class PlainAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String actionA(){
return "actionA";
}
public String actionB(){
return "actionB";
}
}
<struts>
<package name="myPackage" extends="struts-default" >
<action name="first">
<result>/loginOn.jsp</result>
</action>
<action name="plainAction" class="com.milan.actions.PlainAction">
<result name="actionA" type="">/showA.jsp</result>
<result name="actionB" type="">/showB.jsp</result>
</action>
</package>
</struts>
说明:两个关键属性,result 元素的name属性值取该action 的某个方法的返回值,通常设置与对应方法名相同。type 用于设置返回类型,如转发还是重定向,具体取值暂不讨论。
(3)、页面中请求
<a href="first.action">first.action请求struts2</a>
<a href="plainAction!actionA">请求actionA并到达showA.jsp页面</a>
<a href="plainAction!actionB">请求plainAction的actionB方法并到达showB.jsp页面</a>
注:请求一个方法的action:actionName.action,动态请求action:actionName!方法名。
三、关于Struts 2 中的配置
使用Struts 2 时需配置相关文件,以使各程序模块之间可以通信。
1、Struts 2 的配置文件类型
(1)、struts-default.xml:位于core jar包中(该包中还存放了许多dtd文件);是struts2 提供的配置文件。
(2)、struts-plugin.xml:位于struts2 提供的各插件的包中。
(3)、struts.xml:Web 应用默认的struts 2 配置文件,需自己编写。
(4)、struts.properties:struts 2 中属性配置文件,需自己编写。
(5)、web.xml:即该应用的web.xml ,在里面配置Struts 2 的StrutsServlet 或 StrutsPrepareAndExecuteFilter 。
2、配置Struts 2 的package
实例:
<!-- struts元素下与package 元素同级的其它元素
<bean class=""></bean>
<constant name="" value=""></constant>
<include file=""></include> -->
<!--
属性说明:
name:包名,不同于java的包名含义,此处只是用于区别包的
extends:继承于
namespace:指定命名空间,也对应路径,相当于java的包,对应文件夹。相对于根路径。
-->
<package name="parentPackage" extends="struts-default"
namespace="resource">
</package>
<package name="myPackage" extends="parentPackage" namespace="/jsp">
<action name="first">
<result>/loginOn.jsp</result>
</action>
</package>
说明:package 中name属性就是个标识符,用于继承的,不与文件夹对应。namespace 与文件夹对应,所以注意是否要加"/"。
此时访问该action路径应该为:
<a href="resource/jsp/first.action">路径加first.action请求struts2</a>
对应的目录应该为:
说明:继承包后,路径叠加。无论直接继承于哪个包,都要直接或间接继承于struts-default 包,该包在struts-default.xml中定义,用于配置struts2 相关信息。
3、配置struts 2 中action
略。
四、MVC 理解
JSP /Servlet :
Servlet 可充当控制器;
SpringMVC :
控制器为实现Controller 接口的类,web.xml中配置 DispatcherServlet 的servlet 对象转向对应的<自定义的该servlet名>-servlet.xml(见下面 说明一),再在该xml中定义url 映射bean (如org.springframework.web.servlet.handler.SimpleUrlHandlerMapping类,见说明二)与视图解析bean(如org.springframework.web.servlet.view.InternalResourceViewResolver),以及被管理的控制器bean(也即继承Controller 的类,见 说明二)。
Struts /Structs2 :
控制器为实现Action 接口的子类,通过web.xml中配置StrutsServlet 的servlet 对象或 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter 的过滤器对象转向struts.xml。
不管哪种MVC 实现,其思想差不多都是,在特定的控制器(Action)中处理业务,同时可与对应的页面相关联,处理业务后,返回数据或页面。
说明一:
配置方式:
1、默认为WEB-INF下的"servletName-servlet.xml",假设该servlet取名为dispatcherServlet,则对应配置文件应为dispatcherServle-servlet.xml,且在WEB-INF目录下。
2、使用初始化参数指定xml配置文件位置:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:servletNameConfig.xml</param-value>
<!-- 或 <param-value>WEB-INF/servletNameConfig.xml</param-value> -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
多个xml文件使用逗号分隔
说明二:
SpringMVC 中,映射关系也可使用注解方式,见另一篇日志: