使用Struts2进行开发,首先需要导入Struts2所需的jar包,开发所需基本jar包:
编写web.xml文件,添加Struts2核心过滤器:
<filter>编写后台代码:
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class HelloWorldAction {编写struts.xml文件:
public String execute() {
System.out.println("HelloWorld");
return "index";
}
}
在src目录下建立struts.xml文件
<struts>编写index.jsp文件:
<package name="helloworld" namespace="/" extends="struts-default">
<action name="helloWorldAction" class="cn.itcast.HelloWorld.HelloWorldAction">
<result name="index">index.jsp</result>
</action>
</package>
</struts>
<%@ page language="java" contentType="text/html; charset=UTF-8"输出:
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎页面!
</body>
</html>
在浏览器访问http:localhost:8080/struts2_01/helloWorldAction.action,页面跳转至index.jsp页面,Eclipse控制台输出Hello World,证明Struts2环境配置正确。
总结:
1.在web.xml文件中只有一个过滤器,不再需要繁琐的配置;
2.action是一个简单的javabean,与servlet容器没有依赖关系,便于单元测试;
3.多了一个struts.xml文件,该文件配置了url和需要跳转的jsp文件。
注意:
struts.xml文件必须在classpath的根目录下。
补充:
struts.xml为什么一定要在classpath根目录下?
我们在web.xml文件中配置了StrutsPrepareAndExecuteFilter过滤器,查看StrutsPrepareAndExecuteFilter中的init方法:
public void init(FilterConfig filterConfig) throws ServletException {
InitOperations init = new InitOperations();
try {
FilterHostConfig config = new FilterHostConfig(filterConfig);
init.initLogging(config);
Dispatcher dispatcher = init.initDispatcher(config);
init.initStaticContentLoader(config, dispatcher);
prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
postInit(dispatcher, filterConfig);
} finally {
init.cleanup();
}
}
可以看到在
init.initDispatcher(config)中加载了相关配置文件,查看initDIspatcher(config)方法可以看出struts2通过dispatcher.init()方法初始化信息。
public Dispatcher initDispatcher( HostConfig filterConfig ) { Dispatcher dispatcher = createDispatcher(filterConfig); dispatcher.init(); return dispatcher; }查看dispatcher的init()方法可以看出init_TraditionalXmlConfigurations()加载了XML配置文件
public void init() {最后我们查看init_TraditionalXmlConfigurations()方法,
if (configurationManager == null) {
configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
try {
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_CustomConfigurationProviders(); // [5]
init_FilterInitParameters() ; // [6]
init_AliasStandardObjects() ; // [7]
Container container = init_PreloadConfiguration();
container.inject(this);
init_CheckConfigurationReloading(container);
init_CheckWebLogicWorkaround(container);
if (!dispatcherListeners.isEmpty()) {
for (DispatcherListener l : dispatcherListeners) {
l.dispatcherInitialized(this);
}
}
} catch (Exception ex) {
if (LOG.isErrorEnabled())
LOG.error("Dispatcher initialization failed", ex);
throw new StrutsException(ex);
}
}
private void init_TraditionalXmlConfigurations() {我们看到其中有一个变量configPaths = DEFAULT_CONFIGURATION_PATHS,该常量的值如下,可以看出变量并不再任何包下,应该在classpath根目录下:
String configPaths = initParams.get("config");
if (configPaths == null) {
configPaths = DEFAULT_CONFIGURATION_PATHS;
}
String[] files = configPaths.split("\\s*[,]\\s*");
for (String file : files) {
if (file.endsWith(".xml")) {
if ("xwork.xml".equals(file)) {
configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
} else {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
}
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";