前面strust2已经部署好了,现在要写一个action,并且调试通,很简单的一个action,贴出代码:
package com.yj.ssh.action; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { @Override public String execute() throws Exception { return SUCCESS; } }
ActionSupport可以继承也可以不继承,继承的好处是它自己定义了不少方法和常量,如SUCCESS,但是将让该类受到框架侵入,一般情况为了方便就继承他。我写了一个jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>index.jsp</title> </head> <body> <form action="login.action"> <input type="submit" value="登陆"/> </form> </body> </html>
现在要创建strust2配置文件将jsp和action衔接起来,如果把action比作是strust2骨架,那么strust2配置文件就是strust2的灵魂和血液。为了了解strust2的作用,可做如下测试,不创建strust2配置文件,直接启动tomcat,发现启动期未发现任何异常,但是我点登陆按钮,则出现异常:
There is no Action mapped for namespace / and action name login. - [unknown location] at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:178) at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39) at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:478) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619)
很明显,如果没有配置文件,strust2处理器将无法识别action,现在跟踪strust2源文件,看看strust2如何加载配置文件的。我们知道StrutsPrepareAndExecuteFilter是一个Filter,它的一切初始化操作都是在方法init里进行的,现在查看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(); } }
首先创建了一个InitOperations对象,即是初始化操作对象,然后然后生成了该Filter的主配置文件,初始化了日志模块,生成了Dispatcher,查询可知,他是一个调度器,重点就在于这个调度器,他是下面创建准备操作对象和执行操作对象的依赖对象,进入方法init.initDispatcher(config)查看:
/** * Creates and initializes the dispatcher */ public Dispatcher initDispatcher( HostConfig filterConfig ) { Dispatcher dispatcher = createDispatcher(filterConfig); dispatcher.init(); return dispatcher; }
很简单根据配置文件生成一个Dispatcher,并且初始化操作init();进入createDispatcher(filterConfig):
/** * Create a {@link Dispatcher} */ private Dispatcher createDispatcher( HostConfig filterConfig ) { Map<String, String> params = new HashMap<String, String>(); for ( Iterator e = filterConfig.getInitParameterNames(); e.hasNext(); ) { String name = (String) e.next(); String value = filterConfig.getInitParameter(name); params.put(name, value); } return new Dispatcher(filterConfig.getServletContext(), params); }
原来只是从配置文件里读取参数,然后生成Dispatcher。然后进入init查看:
/** * Load configurations, including both XML and zero-configuration strategies, * and update optional settings, including whether to reload configurations and resource files. */ public void init() { if (configurationManager == null) { configurationManager = new ConfigurationManager(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); } }
通读源码才发现,原来这个方法主要是读取配置文件并将自己加载到监听器列表内。看完源码,中央处理器所有的操作都是基于一个对象Dispatcher,他的名字可以看出是分发器类,他主要是通过读取strust2的配置文件来判断该将http请求分发给哪个action,至于分发请求是交给基于Dispatcher对象创建的准备操作类和执行操作类去做的,稍后可以分析doFilter方法。现在先完成strust2的配置文件strust.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> <package name="default" namespace="/" extends="struts-default"> <default-action-ref name="login" /> <action name="login" class="com.yj.ssh.action.LoginAction"> <result name="success">/page/index.jsp</result> </action> </package> <!-- Add packages here --> </struts>
当然这是默认的写法,而且要放在默认路径下,那么如果我基于某些原因想换个名而且不想放在默认路径下该怎么办的,通过刚才的分析很清楚的明白,所有的操作都是基于Dispatcher这个对象,而这个对象的创建是基于FilterConfig对象,其实它就是抽象了的web.xml,所以还要从web.xml下手,查询文档可以发现,需要在web.xml增加初始化参数,如下:
<filter> <filter-name>strust2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>struts-default.xml,config/struts.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>strust2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
增加config参数配置就可以实现非默认情况下的strust.xml文件的配置,不过注意要包含strust-default.xml这个strust的配置文件,否则会报异常,debug跟踪了一下,似乎是不会再加载其他的配置文件了,只加载你配置的文件,所以需要设置这个,设置完之后,就可以启动测试,发现没有什么问题。
相关推荐
SSH整合是Java Web开发中的一个重要概念,它是指Struts2、Spring和Hibernate这三大框架的集成。这三种框架分别在表现层、业务层和服务层提供强大的支持,共同构建出高效、灵活的企业级应用。 **Struts2** 是一个...
在SSH框架整合中,每个框架都有其特定的配置文件,而Struts2作为控制层的核心,其配置文件`struts.xml`尤其关键。 `struts.xml`是Struts2框架的核心配置文件,它定义了应用程序的行为,包括Action的映射、结果的...
在整合过程中,开发者需要注意配置文件的正确设置,包括Struts2的struts.xml、Hibernate的hibernate.cfg.xml以及Spring的applicationContext.xml等。还需要确保各框架之间的依赖注入正确无误,例如,Spring需要知道...
【SSH整合Struts2知识点详解】 SSH(Spring、Struts2、Hibernate)是Java Web开发中的经典框架组合,用于构建企业级应用。Struts2作为MVC(模型-视图-控制器)架构的一部分,主要负责处理用户的请求和展示响应。在...
总结,Struts2配置涉及多个方面,包括核心库的引入、配置文件的编写、Action、Result、Interceptor的定义以及与Spring的整合等。通过合理配置,可以构建出高效、灵活的Web应用。在实际项目中,应根据需求调整和优化...
在"ssh jar"这个压缩包中,我们可能看到的文件名可能是各种Struts2的库文件,例如`struts2-core.jar`,这是Struts2的核心库,包含了框架的基本功能;`struts2-convention-plugin.jar`,用于自动配置Action类;`...
SSH整合是指将Struts2、Spring和Hibernate这三个流行的开源Java框架集成在一起,以构建高效、模块化的企业级Web应用程序。这个“SSH整合 Struts2.1+Spring4.1+Hibernate4.1”是一个预配置的框架模板,适用于快速开发...
SSH整合,即Struts2、Hibernate3和Spring2的集成,是Java Web开发中的常见模式,用于构建高效、模块化的应用程序。在这个小例子中,这三个框架的协同工作使得开发人员能够轻松实现数据持久化、控制层逻辑和业务层...
SSH是Java Web开发中的三个重要框架,分别是Struts2、Hibernate和Spring,它们共同构建了一个强大的MVC(Model-View-Controller)架构。本项目整合了这三个框架,并使用XML配置来管理各个组件,实现了基本的CRUD...
在这个主题下,我们将深入探讨SSH整合涉及的主要配置文件及其作用。 1. **ssh配置文件**: - `sshd_config`: 这是SSH服务器的主要配置文件,位于`/etc/ssh/sshd_config`(在Unix/Linux系统中)。它定义了服务器的...
SSH整合是指将Struts2、Spring和Hibernate这三个开源框架整合在一起,用于构建高效、模块化的企业级Java Web应用。这个压缩包"ssh整合jar (struts2)"显然是为了帮助初学者整理和理解这些框架的集成过程,提供了一个...
SSH整合,全称为Struts2、Hibernate3和Spring3的集成,是Java Web开发中常见的技术栈,用于构建高效、可维护的Web应用程序。这个小实例展示了如何将这三个框架有效地结合在一起,利用它们各自的优势来处理不同的职责...
SSH整合+struts convention插件小示例 全程使用注解扫包,无struts action的配置文件,无Hibernate配置文件, Spring自动扫包来获取bean 数据库内容太简单,不再上传。 只是一个小实例。 请用MyEclipse导入项目。 我...
- 此步骤会自动添加Struts2的相关库,并在`src`目录下生成`struts.xml`配置文件,同时在`web.xml`中配置Struts2的过滤器。 3. **配置Struts2** - 在Struts2的配置界面,可以选择Struts2的版本和所需的Jar包。 - ...
SSH(Spring、Struts2、Hibernate)是一种常见的Java企业级应用开发框架组合,它整合了MVC模式的Struts2、轻量级IoC容器的Spring以及持久层框架Hibernate。在本项目中,我们将探讨如何将Struts2的核心库与SSH中的...
在这个特定的压缩包文件中,"ssh简单整合(struts2)"可能包含了一个简单的SSH整合示例项目,用于帮助初学者理解如何将这三个框架集成在一起。 **Spring框架**: Spring是Java应用中的核心框架,它提供了依赖注入...
整合SSH涉及到的主要配置文件有`struts2-spring-plugin.xml`、`spring-context.xml`以及Hibernate的相关配置文件(如`hibernate.cfg.xml`)。`struts2-spring-plugin.xml`配置Struts2与Spring的集成,确保Action类由...
SSH整合是Java开发中一种常见的框架集成方式,它结合了Struts2、Spring和Hibernate三个开源框架,以提高Web应用的开发效率和可维护性。本文将深入探讨SSH整合的关键概念、配置步骤以及如何实现基本的数据操作功能。 ...
### SSH框架整合详细步骤(spring+struts2+hibernate) #### 一、整合概述 在现代Web应用开发中,SSH(Struts2、Spring、Hibernate)框架因其各自独特的功能和优势,常被组合使用以构建高效、稳定且易于维护的系统...
SSH整合是Java开发中一种常见的框架集成方式,它结合了Struts 2.2.1、Hibernate 3.5.2和Spring 3.0.5这三个强大的开源框架,以实现高效、灵活的企业级Web应用开发。SSH整合的核心目标是通过各框架间的协同工作,提高...