﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-kelly的小空间-随笔分类-java 框架</title><link>http://www.blogjava.net/kelly/category/54114.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Jan 2014 14:17:22 GMT</lastBuildDate><pubDate>Fri, 17 Jan 2014 14:17:22 GMT</pubDate><ttl>60</ttl><item><title>Struts2整合Spring从xml到注解</title><link>http://www.blogjava.net/kelly/archive/2014/01/17/409079.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Fri, 17 Jan 2014 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/17/409079.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/409079.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/17/409079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/409079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/409079.html</trackback:ping><description><![CDATA[<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">struts和spring整合首先要在Web容器启动的时候自动装配ApplicationContext的配置信息，可想而知应该在web.xml做相应的配置：<br />[html]<br />&lt;context-param&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp; &lt;param-value&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath:applicationContext.xml&nbsp;<br />&nbsp;&nbsp;&nbsp; &lt;/param-value&gt;&nbsp;<br />&lt;/context-param&gt;&nbsp;<br />&lt;listener&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;&nbsp;<br />&nbsp;&nbsp; &lt;/listener&gt;&nbsp;<br />配置了org.springframework.web.context.ContextLoaderListener后我们就不惜要编写代码显示地实例化ApplicationContext对象了。至于为什么要使用监听是因为web.xml 的加载顺序是：context-param -&gt; listener -&gt; filter -&gt; servlet 。如果你是在不想使用监听，或许你可以尝试下继承struts2的org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter重写这个它的init方法在StrutsPrepareAndExecuteFilter过滤器init中实例化ApplicationContext对象加载配置信息，虽然这种方法也可行，但是当拦截每个action都会加载一次配置信息，重新实例化了一个新的web容器，不仅浪费了资源也让spring更加依赖了struts。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">1、使用xml方式：<br />struts2配置<br />&lt;package name="user" extends="struts-default"&gt;<br />&lt;action name="login" class="userAction"&gt;<br />&lt;result name="success"&gt;/success.<a style="color: rgb(51,51,51); font-size: 14px; text-decoration: none" class="keylink" href="http://www.2cto.com/kf/web/jsp/" target="_blank">jsp</a>&lt;/result&gt;<br />&lt;result name="input" type="redirect"&gt;/index.jsp&lt;/result&gt;<br />&lt;/action&gt;<br />&lt;/package&gt;<br />spring配置<br />&lt;bean id="userDao" class="org.han.dao.impl.UserDaoImpl" /&gt;<br />&lt;bean id="biz" class="org.han.service.impl.LoginBizImpl"&gt;<br />&lt;property name="userdao" ref="userDao"/&gt;<br />&lt;/bean&gt;</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;bean id="userAction" class="org.han.action.LoginAction" scope="prototype" &gt;<br />&lt;property name="biz" ref="biz" /&gt;<br />&lt;/bean&gt;<br />注意红色部分，struts2的action class与对应的action bean必须相同,这样才能由spring管理action;</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">2、struts2使用零配置方式：<br />当你导入了零配置插件包的时候千万要注意约定大于配置，还是上面的spring配置，只是不需要struts2配置了。<br />第一种方式：只需要将Action的className对应到spring配置中的bean id就行了<br />@Action(value = "/login", results = { @Result(name = "success", location = "/success.jsp"),@Result(name="input",location="/index.jsp")},className="userAction")<br />public String login() throws Exception {<br />// TODO Auto-generated method stub<br />User u=biz.login(this.getUser());<br />if(u!=null){<br />return SUCCESS;<br />}<br />return INPUT;<br />}<br />第二种方式：<br />Action注解不需要className了，将spring配置稍作修改<br />&lt;bean id="org.han.action.LoginAction" class="org.han.action.LoginAction" scope="prototype" &gt;<br />&lt;property name="biz" ref="biz" /&gt;<br />&lt;/bean&gt;<br />这样可以是因为当你使用零配置的时候，action的class默认是当前类的全类名，所以和spring整合的时候刚好使用全类名在spring配置中查找以全类名为id的bean。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">3、struts2、spring都使用注解方式：<br />www.2cto.com<br />&lt;beans xmlns="http://www.springframework.org/schema/beans"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; xmlns:context="http://www.springframework.org/schema/context"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/context&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;&nbsp;<br />&nbsp;&nbsp; &lt;context:component-scan base-package="org.han.dao.impl,org.han.service.impl,org.han.action"/&gt;&nbsp;<br />&lt;/beans&gt;&nbsp;</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;context:component-scan base-package=""/&gt;用此种方式，不需要在配置文件中再配置bean，也不需要再导入上面对应的处理bean。也就是说可以不需要在配置文件中使用&lt;context:annotation-config/&gt;了，因为此种方式会自动导入</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">[java]<br />@Namespace("/")&nbsp;<br />@Component(value="userLogin")&nbsp;<br />@Scope(value="prototype")&nbsp;<br />public class LoginAction extends ActionSupport {&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; public LoginAction() {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated constructor stub&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("action:"+this.hashCode());&nbsp;<br />&nbsp;&nbsp;&nbsp; }&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; @Autowired&nbsp;<br />&nbsp;&nbsp;&nbsp; private ILoginBiz biz;&nbsp;<br />&nbsp;&nbsp;&nbsp; private User user;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; public User getUser() {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return user;&nbsp;<br />&nbsp;&nbsp;&nbsp; }&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; public void setUser(User user) {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.user = user;&nbsp;<br />&nbsp;&nbsp;&nbsp; }&nbsp;<br />&nbsp;&nbsp;&nbsp; @Autowired&nbsp;<br />&nbsp;&nbsp;&nbsp; public void setBiz(ILoginBiz biz) {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.biz = biz;&nbsp;<br />&nbsp;&nbsp;&nbsp; }&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; @Override&nbsp;<br />&nbsp;&nbsp;&nbsp; @Action(value = "hello", results = { @Result(name = "success", location = "/success.jsp"),@Result(name="input",location="/index.jsp")})&nbsp;<br />&nbsp;&nbsp;&nbsp; public String execute() throws Exception {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("biz:"+this.biz.hashCode());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User u=biz.login(this.getUser());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(u!=null){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return INPUT;&nbsp;<br />&nbsp;&nbsp;&nbsp; }&nbsp;<br />}&nbsp;<br />@Component 有一个可选的入参，用于指定 Bean 的名称。一般情况下，Bean 都是 singleton 的，需要注入 Bean 的地方仅需要通过 byType 策略就可以自动注入了，所以大可不必指定 Bean 的名称。除了提供 @Component 注释外，还定义了几个拥有特殊语义的注释，它们分别是：@Repository、@Service 和 @Controller。在目前的 Spring 版本中，这 3 个注释和 @Component 是等效的，但是从注释类的命名上，很容易看出这 3 个注释分别和持久层、业务层和控制层（Web 层）相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意，但 Spring 将在以后的版本中为它们添加特殊的功能。所以，如果 Web 应用程序采用了经典的三层分层结构的话，最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释，而用 @Component 对那些比较中立的类进行注释。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">@Scope用于定义Bean的作用范围。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">@Autowired 注释，它可以对类成员变量、方法及构造函数进行标注，完成自动装配的工作。当 Spring 容器启动时，AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean，当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配（默认按类型匹配）的 Bean，并注入到对应的地方中去。所以对成员变量使用 @Autowired 后，您大可将它们的 setter 方法删除。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">@Qualifier(&#8220;name&#8221;) 中的 name是 Bean 的名称，所以 @Autowired 和 @Qualifier 结合使用时，自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释，而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">@PostConstruct 和 @PreDestroy:JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类，这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用，而标注了 @PreDestroy 的方法将在类销毁之前调用。<br />通过 &lt;bean&gt; 元素的 init-method/destroy-method 属性进行配置，都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法，那些被标注 @PostConstruct 或@PreDestroy 注释的方法都会在初始化 / 销毁时被执行。<br />更多的关于注解使用：请看官方文档</p>
<p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); list-style-type: none; text-indent: 2em; margin: 0px 0px 8px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; color: rgb(51,51,51); border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">4、总结：<br />1、注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的，（如 Service 使用了哪几个 DAO 类），这种配置信息不会在部署时发生调整，那么注释配置优于 XML 配置；反之如果这种依赖关系会在部署时发生调整，XML 配置显然又优于注释配置，因为注释是对<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(51,51,51); font-size: 14px; text-decoration: none" class="keylink" href="http://www.2cto.com/kf/ware/Java/" target="_blank">Java</a><span class="Apple-converted-space">&nbsp;</span>源代码的调整，您需要重新改写源代码并重新编译才可以实施调整。<br />2、如果 Bean 不是自己编写的类（如 JdbcTemplate、SessionFactoryBean 等），注释配置将无法实施，此时 XML 配置是唯一可用的方式。<br />3、注释配置往往是类级别的，而 XML 配置则可以表现得更加灵活。比如相比于 @Transaction 事务注释，使用 aop/tx 命名空间的事务配置更加灵活和简单。<br />所以在实现应用中，我们往往需要同时使用注释配置和 XML 配置，对于类级别且不会发生变动的配置可以优先考虑注释配置；而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring 会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。</p><img src ="http://www.blogjava.net/kelly/aggbug/409079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-17 21:51 <a href="http://www.blogjava.net/kelly/archive/2014/01/17/409079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring注解讲解</title><link>http://www.blogjava.net/kelly/archive/2014/01/17/409054.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Fri, 17 Jan 2014 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/17/409054.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/409054.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/17/409054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/409054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/409054.html</trackback:ping><description><![CDATA[<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">来自：<a href="http://hanyexiaoxiao.iteye.com/blog/410123">http://hanyexiaoxiao.iteye.com/blog/410123</a><br />1. 使用Spring注解来注入属性<span class="Apple-converted-space">&nbsp;</span><br />1.1. 使用注解以前我们是怎样注入属性的<span class="Apple-converted-space">&nbsp;</span><br />类的实现：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">public class UserManagerImpl implements UserManager {
	private UserDao userDao;
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	...
}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />配置文件：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">&lt;bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl"&gt;
	&lt;property name="userDao" ref="userDao" /&gt;
&lt;/bean&gt;
&lt;bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl"&gt;
	&lt;property name="sessionFactory" ref="mySessionFactory" /&gt;
&lt;/bean&gt;
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><br />1.2. 引入@Autowired注解（不推荐使用，建议使用@Resource）<span class="Apple-converted-space">&nbsp;</span><br />类的实现（对成员变量进行标注）</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">public class UserManagerImpl implements UserManager {
	@Autowired
	private UserDao userDao;
	...
}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />或者（对方法进行标注）</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">public class UserManagerImpl implements UserManager {
	private UserDao userDao;
	@Autowired
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	...
}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />配置文件</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">&lt;bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl" /&gt;
&lt;bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl"&gt;
	&lt;property name="sessionFactory" ref="mySessionFactory" /&gt;
&lt;/bean&gt;
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />@Autowired可以对成员变量、方法和构造函数进行标注，来完成自动装配的工作。以上两种不同实现方式中，@Autowired的标注位置不同，它们都会在Spring在初始化userManagerImpl这个bean时，自动装配userDao这个属性，区别是：第一种实现中，Spring会直接将UserDao类型的唯一一个bean赋值给userDao这个成员变量；第二种实现中，Spring会调用setUserDao方法来将UserDao类型的唯一一个bean装配到userDao这个属性。<span class="Apple-converted-space">&nbsp;</span><br /><br />1.3. 让@Autowired工作起来<span class="Apple-converted-space">&nbsp;</span><br />要使@Autowired能够工作，还需要在配置文件中加入以下代码</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">&lt;bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /&gt;
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><br />1.4. @Qualifier<span class="Apple-converted-space">&nbsp;</span><br />@Autowired是根据类型进行自动装配的。在上面的例子中，如果当Spring上下文中存在不止一个UserDao类型的bean时，就会抛出BeanCreationException异常；如果Spring上下文中不存在UserDao类型的bean，也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。<span class="Apple-converted-space">&nbsp;</span><br />1. 可能存在多个UserDao实例</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">	@Autowired
	public void setUserDao(@Qualifier("userDao") UserDao userDao) {
		this.userDao = userDao;
	}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />这样，Spring会找到id为userDao的bean进行装配。<span class="Apple-converted-space">&nbsp;</span><br />2. 可能不存在UserDao实例</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">	@Autowired(required = false)
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><br />1.5. @Resource（JSR-250标准注解，推荐使用它来代替Spring专有的@Autowired注解）<span class="Apple-converted-space">&nbsp;</span><br />Spring 不但支持自己定义的@Autowired注解，还支持几个由JSR-250规范定义的注解，它们分别是@Resource、@PostConstruct以及@PreDestroy。<span class="Apple-converted-space">&nbsp;</span><br />@Resource的作用相当于@Autowired，只不过@Autowired按byType自动注入，而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的，分别是name和type，Spring将@Resource注解的name属性解析为bean的名字，而type属性则解析为bean的类型。所以如果使用name属性，则使用byName的自动注入策略，而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性，这时将通过反射机制使用byName自动注入策略。<span class="Apple-converted-space">&nbsp;</span><br />@Resource装配顺序</p>
<ol style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px 0px 1.5em; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/1.4em Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; font-size: 1em; padding-top: 0px">如果同时指定了name和type，则从Spring上下文中找到唯一匹配的bean进行装配，找不到则抛出异常</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; font-size: 1em; padding-top: 0px">如果指定了name，则从上下文中查找名称（id）匹配的bean进行装配，找不到则抛出异常</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; font-size: 1em; padding-top: 0px">如果指定了type，则从上下文中找到类型匹配的唯一bean进行装配，找不到或者找到多个，都会抛出异常</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; font-size: 1em; padding-top: 0px">如果既没有指定name，又没有指定type，则自动按照byName方式进行装配（见2）；如果没有匹配，则回退为一个原始类型（UserDao）进行匹配，如果匹配则自动装配；</li></ol>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><br />1.6. @PostConstruct（JSR-250）<span class="Apple-converted-space">&nbsp;</span><br />在方法上加上注解@PostConstruct，这个方法就会在Bean初始化之后被Spring容器执行（注：Bean初始化包括，实例化Bean，并装配Bean的属性（依赖注入））。<span class="Apple-converted-space">&nbsp;</span><br />它的一个典型的应用场景是，当你需要往Bean里注入一个其父类中定义的属性，而你又无法复写父类的属性或属性的setter方法时，如：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
	private SessionFactory mySessionFacotry;
	@Resource
	public void setMySessionFacotry(SessionFactory sessionFacotry) {
		this.mySessionFacotry = sessionFacotry;
	}
	@PostConstruct
	public void injectSessionFactory() {
		super.setSessionFactory(mySessionFacotry);
	}
	...
}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />这里通过@PostConstruct，为UserDaoImpl的父类里定义的一个sessionFactory私有属性，注入了我们自己定义的sessionFactory（父类的setSessionFactory方法为final，不可复写），之后我们就可以通过调用super.getSessionFactory()来访问该属性了。<span class="Apple-converted-space">&nbsp;</span><br /><br />1.7. @PreDestroy（JSR-250）<span class="Apple-converted-space">&nbsp;</span><br />在方法上加上注解@PreDestroy，这个方法就会在Bean初始化之后被Spring容器执行。由于我们当前还没有需要用到它的场景，这里不不去演示。其用法同@PostConstruct。<span class="Apple-converted-space">&nbsp;</span><br /><br />1.8. 使用&lt;context:annotation-config /&gt;简化配置<span class="Apple-converted-space">&nbsp;</span><br />Spring2.1添加了一个新的context的Schema命名空间，该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。我们知道注释本身是不会做任何事情的，它仅提供元数据信息。要使元数据信息真正起作用，必须让负责处理这些元数据的处理器工作起来。<span class="Apple-converted-space">&nbsp;</span><br />AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor就是处理这些注释元数据的处理器。但是直接在Spring配置文件中定义这些Bean显得比较笨拙。Spring为我们提供了一种方便的注册这些BeanPostProcessor的方式，这就是&lt;context:annotation-config /&gt;：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;
	&lt;context:annotation-config /&gt;
&lt;/beans&gt;
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />&lt;context:annotationconfig /&gt;将隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor以及RequiredAnnotationBeanPostProcessor这4个BeanPostProcessor。<span class="Apple-converted-space">&nbsp;</span><br /><br />2. 使用Spring注解完成Bean的定义<span class="Apple-converted-space">&nbsp;</span><br />以上我们介绍了通过@Autowired或@Resource来实现在Bean中自动注入的功能，下面我们将介绍如何注解Bean，从而从XML配置文件中完全移除Bean定义的配置。<span class="Apple-converted-space">&nbsp;</span><br /><br />2.1. @Component（不推荐使用）、@Repository、@Service、@Controller<span class="Apple-converted-space">&nbsp;</span><br />只需要在对应的类上加上一个@Component注解，就将该类定义为一个Bean了：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">@Component
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
	...
}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />使用@Component注解定义的Bean，默认的名称（id）是小写开头的非限定类名。如这里定义的Bean名称就是userDaoImpl。你也可以指定Bean的名称：<span class="Apple-converted-space">&nbsp;</span><br />@Component("userDao")<span class="Apple-converted-space">&nbsp;</span><br />@Component是所有受Spring管理组件的通用形式，Spring还提供了更加细化的注解形式：@Repository、@Service、@Controller，它们分别对应存储层Bean，业务层Bean，和展示层Bean。目前版本（2.5）中，这些注解与@Component的语义是一样的，完全通用，在Spring以后的版本中可能会给它们追加更多的语义。所以，我们推荐使用@Repository、@Service、@Controller来替代@Component。<span class="Apple-converted-space">&nbsp;</span><br /><br />2.2. 使用&lt;context:component-scan /&gt;让Bean定义注解工作起来</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;
	&lt;context:component-scan base-package="com.kedacom.ksoa" /&gt;
&lt;/beans&gt;
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />这里，所有通过&lt;bean&gt;元素定义Bean的配置内容已经被移除，仅需要添加一行&lt;context:component-scan /&gt;配置就解决所有问题了&#8212;&#8212;Spring XML配置文件得到了极致的简化（当然配置元数据还是需要的，只不过以注释形式存在罢了）。&lt;context:component-scan /&gt;的base-package属性指定了需要扫描的类包，类包及其递归子包中所有的类都会被处理。<span class="Apple-converted-space">&nbsp;</span><br />&lt;context:component-scan /&gt;还允许定义过滤器将基包下的某些类纳入或排除。Spring支持以下4种类型的过滤方式：</p>
<ul style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px 0px 1.5em; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px">过滤器类型 表达式范例 说明</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px">注解 org.example.SomeAnnotation 将所有使用SomeAnnotation注解的类过滤出来</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px">类名指定 org.example.SomeClass 过滤指定的类</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px">正则表达式 com\.kedacom\.spring\.annotation\.web\..* 通过正则表达式过滤一些类</li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px">AspectJ表达式 org.example..*Service+ 通过AspectJ表达式过滤一些类</li></ul>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />以正则表达式为例，我列举一个应用实例：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">	&lt;context:component-scan base-package="com.casheen.spring.annotation"&gt;
		&lt;context:exclude-filter type="regex" expression="com\.casheen\.spring\.annotation\.web\..*" /&gt;
	&lt;/context:component-scan&gt;
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />值得注意的是&lt;context:component-scan /&gt;配置项不但启用了对类包进行扫描以实施注释驱动Bean定义的功能，同时还启用了注释驱动自动注入的功能（即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor），因此当使用&lt;context:component-scan /&gt;后，就可以将&lt;context:annotation-config /&gt;移除了。<span class="Apple-converted-space">&nbsp;</span><br /><br />2.3. 使用@Scope来定义Bean的作用范围<span class="Apple-converted-space">&nbsp;</span><br />在使用XML定义Bean时，我们可能还需要通过bean的scope属性来定义一个Bean的作用范围，我们同样可以通过@Scope注解来完成这项工作：</p><pre style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/25px monospace; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="java" name="code_lighted">@Scope("session")
@Component()
public class UserSessionBean implements Serializable {
	...
}
</pre>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px Helvetica, Tahoma, Arial, sans-serif; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><br />3. 参考<span class="Apple-converted-space">&nbsp;</span><br />http://kingtai168.iteye.com/blog/244002<span class="Apple-converted-space">&nbsp;</span><br />http://www.iteye.com/topic/244153<span class="Apple-converted-space">&nbsp;</span><br />http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config<span class="Apple-converted-space">&nbsp;</span><br />http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-classpath-scanning</p><img src ="http://www.blogjava.net/kelly/aggbug/409054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-17 12:00 <a href="http://www.blogjava.net/kelly/archive/2014/01/17/409054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2.3+Spring3.2的整合</title><link>http://www.blogjava.net/kelly/archive/2014/01/16/409003.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 16 Jan 2014 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/16/409003.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/409003.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/16/409003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/409003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/409003.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts2.3+Spring3.2的整合&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两天都是一直在鼓捣Struts2.3如何整合Spring3.2以及dao层到底选用什么以及如何整合。下面就把自己这两天的一些小成果分享出来也以便自己以后在实际项目中快速搭建。首先是Struts2.3整合Spring3.21、新建一个web工程（这个就不说了）2、添...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly/archive/2014/01/16/409003.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly/aggbug/409003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-16 10:32 <a href="http://www.blogjava.net/kelly/archive/2014/01/16/409003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>No configuration found for the specified action</title><link>http://www.blogjava.net/kelly/archive/2014/01/16/408997.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 16 Jan 2014 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/16/408997.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408997.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/16/408997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408997.html</trackback:ping><description><![CDATA[<p>&nbsp;<span style="font-family: 宋体">警告信息如下：</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">警告</span>: No configuration found for the specified action: '/myNameSpace/login.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">struts.xml<span style="font-family: 宋体">配置信息（部分）</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;package name="packageName" extends="struts-default" namespace="/myNameSpace"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp; &lt;action name="login" class="com.jato.srvclink.test.login.LoginAction" method="login"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">jsp<span style="font-family: 宋体">页面配置信息（部分）</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;s:form action="/myNameSpace/login.action"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">思考：没有在</span>''<span style="font-family: 宋体">的</span>namespace<span style="font-family: 宋体">中发现指定的</span>action '/myNameSpace/login.action'</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">答疑：因为配置的</span>struts2<span style="font-family: 宋体">标签并未指定</span>namespace<span style="font-family: 宋体">属性。所以</span>struts2<span style="font-family: 宋体">会默认从根命名空间</span>"/"<span style="font-family: 宋体">搜索</span>action<span style="font-family: 宋体">串</span>' /myNameSpace/login.action'<span style="font-family: 宋体">，如果搜索不到将进入默认命名空间</span>''<span style="font-family: 宋体">搜索</span>action<span style="font-family: 宋体">请求串，在默认命名空间中是肯定找不到我们</span> <span style="font-family: 宋体">定义的</span>action<span style="font-family: 宋体">的，所以，</span>struts2<span style="font-family: 宋体">抛出一个警告信息。</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">但是为什么我们没有填写</span>namespace<span style="font-family: 宋体">，我们的请求也可以正常访问呢？</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">我们来看一下解析后的</span>html</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">查看源码得到的</span>html<span style="font-family: 宋体">（部分）</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;form id="login" onsubmit="return true;" action="/srvclink/myNameSpace/login.action" method="post"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">我们看到</span>form<span style="font-family: 宋体">提交的</span>action<span style="font-family: 宋体">串是准确的</span>url<span style="font-family: 宋体">请求，</span>action<span style="font-family: 宋体">串确实是</span>/srvclin<span style="font-family: 宋体">（应用根）</span>/myNameSpace<span style="font-family: 宋体">（命名空间）</span>/login.action<span style="font-family: 宋体">。</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">命名空间中找不到</span>action<span style="font-family: 宋体">定义，并不意味着这个</span>action<span style="font-family: 宋体">真的不存在，只是我们的代码有问题而已。还有一点是我们在</span>jsp<span style="font-family: 宋体">页面的</span>action<span style="font-family: 宋体">请求中</span> <span style="font-family: 宋体">手动的加入了</span>.action<span style="font-family: 宋体">后缀。事实上</span>struts2<span style="font-family: 宋体">会自动追加</span>.action<span style="font-family: 宋体">的，因为我们并没有合法的使用</span>struts2<span style="font-family: 宋体">的标签，所以</span>struts2 <span style="font-family: 宋体">这里并没有给我们追加</span>.action<span style="font-family: 宋体">，解析后的代码中存在的</span>.action<span style="font-family: 宋体">，完全是我们手动在</span>jsp<span style="font-family: 宋体">页面填写的，有疑问的网友可以不手动添加查看</span> html<span style="font-family: 宋体">。</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">我们修改我们的程序代码</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">jsp<span style="font-family: 宋体">页面配置信息（部分）修改后加入</span>namespace<span style="font-family: 宋体">属性，修改</span>action<span style="font-family: 宋体">属性值为</span>/login.action</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;s:form action="/login.action" namespace="/myNameSpace"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">请求页面后，大家很失望吧？警告依然存在。但是我们看一下警告信息。</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">警告信息：</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">警告</span>: No configuration found for the specified action: '/login.action' in namespace: '/myNameSpace'. Form action defaulting to 'action' attribute's literal value.</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">没有在</span>'/myNameSpace'<span style="font-family: 宋体">的</span>namespace<span style="font-family: 宋体">中发现指定的</span>action '/login.action'</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">毫无疑问，这里的警告和第一次的警告信息截然不同。我们现在存在命名空间，</span>'/myNameSpace'<span style="font-family: 宋体">能够被</span>struts2<span style="font-family: 宋体">检索到，并不是开始的</span>''<span style="font-family: 宋体">。那问题的关键在哪里呢？</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">在</span>namespace<span style="font-family: 宋体">中没有发现指定的</span>action '/login.action' <span style="font-family: 宋体">？？？</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">我们来看一下</span>struts.xml<span style="font-family: 宋体">中的配置：</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">struts.xml<span style="font-family: 宋体">配置信息（部分）</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;package name="packageName" extends="struts-default" namespace="/myNameSpace"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp; &lt;action name="login" class="com.jato.srvclink.test.login.LoginAction" method="login"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">是的，我们</span>'/myNameSpace'<span style="font-family: 宋体">命名空间下，只有</span>action<span style="font-family: 宋体">名字为</span>'login'<span style="font-family: 宋体">的定义，并没有所谓的</span>'/login.action' <span style="font-family: 宋体">定义，所以</span>struts2<span style="font-family: 宋体">的警告并未错。如果大家对这个抱有怀疑，可以修改</span>action<span style="font-family: 宋体">的名字</span>'login'<span style="font-family: 宋体">为</span>&#8216;/longin.action&#8217;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;action name="/login.action" class="com.jato.srvclink.test.login.LoginAction" method="login"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">请求页面时你会发现不在报警告信息，原因很简单。因为在命名空间为</span>'myNameSpace'<span style="font-family: 宋体">下确实存在命名为</span>'/login.action'<span style="font-family: 宋体">的</span>action<span style="font-family: 宋体">。</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">我们再次修改配置文件</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">jsp<span style="font-family: 宋体">页面配置信息（部分）修改后</span>action<span style="font-family: 宋体">属性值为</span>longin</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;s:form action="login" namespace="/myNameSpace"&gt;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">请求页面时，我们发现不再有警告信息了。</span></p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">如果你有足够细心，我想你应该可以彻底的明白为什么</span>struts2<span style="font-family: 宋体">会报警了吧？你也应该明白了使用</span>struts2<span style="font-family: 宋体">标签</span>action<span style="font-family: 宋体">中添加</span>/<span style="font-family: 宋体">线后请求反而报错的原因了。</span></p><img src ="http://www.blogjava.net/kelly/aggbug/408997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-16 10:13 <a href="http://www.blogjava.net/kelly/archive/2014/01/16/408997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单Struts2实例(入门级)-转</title><link>http://www.blogjava.net/kelly/archive/2014/01/10/408760.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Fri, 10 Jan 2014 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/10/408760.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408760.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/10/408760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408760.html</trackback:ping><description><![CDATA[<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="color: rgb(0,0,255)">功能：本实例实现的功能是从输入界面输入用户名和密码，若用户名和密码正确转到成功界面，否则转到失败界面。</span></p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; 实现：<br />&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="color: rgb(255,0,0)">第一步：创建一个Web工程<br /></span>&nbsp;&nbsp; 在MyEclipse，通过菜单File-&gt;New-&gt;Web Project，在Project Name输入工程名称Strut2Travel，点解确定完成创建一个工程。<br />&nbsp;&nbsp; 简注：MyEclipse属于一个IDE继承开发环境，可以快速的创建Web项目。读者可以手工创建，只需满足项目的文件结构即可。其中WEB-INF文件夹必不可少。</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="color: rgb(255,0,0)">第二步：导入Struts2的核心支持包</span><br />&nbsp;&nbsp; commons-fileupload-1.2.1.jar</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; commons-io-1.3.2.jar</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; commons-logging-1.0.4.jar</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; freemarker-2.3.15.jar</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; ognl-2.7.3.jar</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp;struts2-core-2.1.8.1.jar</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; xwork-core-2.1.6.jar<br />&nbsp;&nbsp; 简注：Struts2有大量的jar包，支持大量的功能，不同类型的应用可能需要不同的包支持。以上的5个包为Struts2的核心包，使用Struts2必须使用。</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="color: rgb(255,0,0)">第三步：配置struts2转发过滤器</span><br />&nbsp;&nbsp; 编辑web.xml文件，添加以下内容<br />&nbsp;&lt;filter&gt;<br />&nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp; &lt;filter-class&gt;<br />&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />&nbsp; &lt;/filter-class&gt;<br />&nbsp;&lt;/filter&gt;<br />&nbsp;&lt;filter-mapping&gt;<br />&nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; 简注：&#8220;/*&#8221;表示涉及本工程的所有浏览器端的请求都经过struts2过滤器处理。</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)"><span class="Apple-converted-space">&nbsp;</span>第四步</span>：创建输入页面login.jsp、结果页面welcome.jsp和error.jsp<br /><span style="color: rgb(255,0,0)">login.jsp<br /></span>&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&nbsp; &lt;head&gt;&lt;title&gt;登录界面&lt;/title&gt;&lt;/head&gt;<br />&nbsp; &lt;body&gt;<br />&nbsp;&nbsp;&nbsp; &lt;form action="LoginAction.action"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户名：&lt;input name="username"&gt;&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 密 码：&lt;input type="password" name="userpass"&gt;&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" value="提 交"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="reset"&nbsp; value="取 消"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp; &lt;/body&gt;<br />&lt;/html&gt;</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><span style="color: rgb(255,0,0)">welcome.jsp<br /></span>&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&nbsp; &lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;欢迎&lt;/title&gt;<br />&nbsp; &lt;/head&gt;<br />&nbsp; &lt;body&gt;<br />&nbsp;&nbsp;&nbsp; &lt;font color="red" size="10"&gt;登录成功！&lt;/font&gt;<br />&nbsp; &lt;/body&gt;<br />&lt;/html&gt;</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><span style="color: rgb(255,0,0)">error.jsp<br /></span>&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&nbsp; &lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;&lt;/title&gt;<br />&nbsp; &lt;/head&gt;<br />&nbsp; &lt;body&gt;<br />&nbsp;&nbsp;&nbsp; &lt;font color="red" size="10"&gt;用户或密码错误！&lt;/font&gt;<br />&nbsp; &lt;/body&gt;<br />&lt;/html&gt;<br />&nbsp;&nbsp;&nbsp; 简注：本实例是最简单的应用，以上为纯JSP文件，Struts2提供大量使用的标签，本书后面的实例会使用到。</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)"><span class="Apple-converted-space">&nbsp;</span>第五步</span>：创建Action文件LoginAction和struts2.xml文件<br />LoginAction.java<br />package com;</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">import com.opensymphony.xwork2.ActionSupport;</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">public class LoginAction extends ActionSupport{<br />&nbsp;private String username;<br />&nbsp;private String userpass;<br />&nbsp;<br />&nbsp;public String execute(){<br />&nbsp; if("daniel".equals(username)&amp;&amp;"abcde".equals(userpass))<br />&nbsp;&nbsp; return SUCCESS;<br />&nbsp; else<br />&nbsp;&nbsp; return ERROR;<br />&nbsp;}<br />&nbsp;<br />&nbsp;public String getUsername() {<br />&nbsp; return username;<br />&nbsp;}<br />&nbsp;public void setUsername(String username) {<br />&nbsp; this.username = username;<br />&nbsp;}<br />&nbsp;public String getUserpass() {<br />&nbsp; return userpass;<br />&nbsp;}<br />&nbsp;public void setUserpass(String userpass) {<br />&nbsp; this.userpass = userpass;<br />&nbsp;}<br />}</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />&nbsp;&nbsp;&nbsp; 简注：默认配置情况下执行execute()方法，实际应用中经常更改配置。本书后面将深入讲解。注意本类中的username和userpass必须和网页文件的name属性名一致。<br />struts.xml<br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="text-decoration: underline"><span class="Apple-converted-space">&nbsp;</span>"</span><a style="color: rgb(51,102,153); text-decoration: none" href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a><span style="text-decoration: underline">"&gt;<br /></span>&lt;struts&gt;<br />&nbsp;&lt;package name="struts2demo" extends="struts-default"&gt;<br />&nbsp;&nbsp; &lt;action name="loginAction" class="com.LoginAction"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="error"&gt;/error.jsp&lt;/result&gt;<br />&nbsp;&nbsp; &lt;/action&gt;<br />&nbsp;&lt;/package&gt;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />&lt;/struts&gt;</p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp; 第五步：将程序发布到Tomcat，启动Tomcat即可。<br />&nbsp;&nbsp;&nbsp; 通过本实例读者应该掌握如何配置并编写一个最简单最基本的应用，对于初学读者以了解为主，没必要深究一些问题。</p><img src ="http://www.blogjava.net/kelly/aggbug/408760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-10 11:18 <a href="http://www.blogjava.net/kelly/archive/2014/01/10/408760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2基于注解的Action配置</title><link>http://www.blogjava.net/kelly/archive/2014/01/09/408736.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 09 Jan 2014 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/09/408736.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408736.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/09/408736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408736.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用注解来配置Action的最大好处就是可以实现零配置，但是事务都是有利有弊的，使用方便，维护起来就没那么方便了。&nbsp;要使用注解方式，我们必须添加一个额外包：struts2-convention-plugin-2.x.x.jar。&nbsp;虽说是零配置的，但struts.xml还是少不了的，配置如下：&nbsp;&lt;?xml version="1.0" enc...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly/archive/2014/01/09/408736.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly/aggbug/408736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-09 16:20 <a href="http://www.blogjava.net/kelly/archive/2014/01/09/408736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2教程1：第一个Struts2程序 -转</title><link>http://www.blogjava.net/kelly/archive/2014/01/09/408727.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 09 Jan 2014 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/09/408727.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408727.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/09/408727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408727.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<h2><a id="viewpost1_TitleUrl" href="file:///E:/资料大全/Spring+struts/Struts2教程1：第一个Struts2程序%20-%20李宁的极客世界%20-%20BlogJava_files/Struts2教程1：第一个Struts2程序%20-%20李宁的极客世界%20-%20BlogJava.htm">Struts2教程1：第一个Struts2程序</a> <br /><br /><span style="font-family: 宋体">在本系列教程中我们将学习到</span>Struts2<span style="font-family: 宋体">的各种技术。在本教程中使用的工具和程序库的版本如下：</span> </h2>
<div class="postbody">
<p><span style="font-family: 宋体">开发工具：</span>MyEclipse6</p>
<p>Web<span style="font-family: 宋体">服务器：</span>Tomcat6</p>
<p>Struts<span style="font-family: 宋体">版本：</span>Struts2.0.11.1</p>
<p>JDK<span style="font-family: 宋体">版本：</span>JDK1.5.0_12</p>
<p>J2EE<span style="font-family: 宋体">版本：</span>Java EE5.0</p>
<p><span style="font-family: 宋体">在本系列教程中</span>Web<span style="font-family: 宋体">工程的上下文路径都是</span>struts2<span style="font-family: 宋体">，如果在</span>Web<span style="font-family: 宋体">根目录有一个</span>index.jsp<span style="font-family: 宋体">文件，则访问路径如下：</span><br /><br />http://localhost:8080/struts2/index.jsp</p>
<p><span style="font-family: 宋体">由于</span>MyEclipse6<span style="font-family: 宋体">目前并不支持</span>Struts2<span style="font-family: 宋体">，所以我们需要到</span>struts.apache.org<span style="font-family: 宋体">去下载</span>Struts2<span style="font-family: 宋体">安装包。要想正常使用</span>Struts2<span style="font-family: 宋体">，至少需要如下五个包（可能会因为</span>Struts2<span style="font-family: 宋体">的版本不同，包名略有差异，但包名的前半部是一样的）。</span></p>
<p>struts2-core-2.0.11.1.jar</p>
<p>xwork-2.0.4.jar</p>
<p>commons-logging-1.0.4.jar</p>
<p>freemarker-2.3.8.jar</p>
<p>ognl-2.6.11.jar</p>
<p>Struts2<span style="font-family: 宋体">虽然在大版本号上是第二个版本，但基本上在配置和使用上已经完全颠覆了</span>Struts1.x<span style="font-family: 宋体">的方式（当然，</span>Struts2<span style="font-family: 宋体">仍然是基于</span>MVC<span style="font-family: 宋体">模式的，也是动作驱动的，可能这是唯一没变的东西）。</span>Struts2<span style="font-family: 宋体">实际上是在</span>Webwork<span style="font-family: 宋体">基础上构建起来的</span>MVC<span style="font-family: 宋体">框架。我们从</span>Struts2<span style="font-family: 宋体">的源代码中可以看到，有很多都是直接使用的</span>xwork(Webwork<span style="font-family: 宋体">的核心技术</span>)<span style="font-family: 宋体">的包。既然从技术上来说</span>Struts2<span style="font-family: 宋体">是全新的框架，那么就让我们来学习一下这个新的框架的使用方法。</span></p>
<p><span style="font-family: 宋体">如果大家使用过</span>Struts1.x<span style="font-family: 宋体">，应该对建立基于</span>Struts1.x<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">程序的基本步骤非常清楚。让我们先来回顾一下建立基于</span>Struts1.x<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">程序的基本步骤。</span></p>
<p style="text-indent: -19.5pt; margin-left: 19.5pt">1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span><span style="font-family: 宋体">安装</span>Struts<span style="font-family: 宋体">。由于</span>Struts<span style="font-family: 宋体">的入口点是</span>ActionServlet<span style="font-family: 宋体">，所以得在</span>web.xml<span style="font-family: 宋体">中配置一下这个</span>Servlet<span style="font-family: 宋体">。</span></p>
<p style="text-indent: -19.5pt; margin-left: 19.5pt">2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span><span style="font-family: 宋体">编写</span>Action<span style="font-family: 宋体">类（一般从</span>org.apache.struts.action.Action<span style="font-family: 宋体">类继承）。</span></p>
<p style="text-indent: -19.5pt; margin-left: 19.5pt">3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span><span style="font-family: 宋体">编写</span>ActionForm<span style="font-family: 宋体">类（一般从</span>org.apache.struts.action.ActionForm<span style="font-family: 宋体">类继承），这一步不是必须的，如果要接收客户端提交的数据，需要执行这一步。</span></p>
<p style="text-indent: -19.5pt; margin-left: 19.5pt">4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span><span style="font-family: 宋体">在</span>struts-config.xml<span style="font-family: 宋体">文件中配置</span>Action<span style="font-family: 宋体">和</span>ActionForm<span style="font-family: 宋体">。</span></p>
<p style="text-indent: -19.5pt; margin-left: 19.5pt">5.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span><span style="font-family: 宋体">如果要</span><span style="font-family: 宋体">采集用户录入的数据，一般需要编写若干</span>JSP<span style="font-family: 宋体">页面，并通过这些</span>JSP<span style="font-family: 宋体">页面中的</span>form<span style="font-family: 宋体">将数据提交给</span>Action<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">下面我们就按着编写</span>struts1.x<span style="font-family: 宋体">程序的</span><span style="font-family: 宋体">这五步和</span>struts2.x<span style="font-family: 宋体">程序的编写过程一一对应，看看它们谁更&#8220;酷&#8221;。下面我们来编写一个基于</span>Struts2<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">程序。这个程序的功能是让用户录入两个整数，并提交给一个</span>Struts Action<span style="font-family: 宋体">，并计算这两个数的代数和，如果代码和为非负数，则跳转到</span>positive.jsp<span style="font-family: 宋体">页面，否则跳转到</span>negative.jsp<span style="font-family: 宋体">页面。<br /><br /></span></p>
<p><strong><span style="font-family: 宋体">【第</span>1</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">安装</span>Struts2</p>
<p><span style="font-family: 宋体">这一步对于</span>Struts1.x<span style="font-family: 宋体">和</span>Struts2<span style="font-family: 宋体">都是必须的，只是安装的方法不同。</span>Struts1<span style="font-family: 宋体">的入口点是一个</span>Servlet<span style="font-family: 宋体">，而</span>Struts2<span style="font-family: 宋体">的入口点是一个过滤器</span>(Filter)<span style="font-family: 宋体">。因此，</span>Struts2<span style="font-family: 宋体">要按过滤器的方式配置。下面是在</span>web.xml<span style="font-family: 宋体">中配置</span>Struts2<span style="font-family: 宋体">的代码：</span></p>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">filter</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">filter-name</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">struts2</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">filter-name</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">filter-class</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />org.apache.struts2.dispatcher.FilterDispatcher <br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">filter-class</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">filter</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">filter-mapping</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">filter-name</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">struts2</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">filter-name</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">url-pattern</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">/*</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">url-pattern</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">filter-mapping</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span></div><br />
<p><strong><span style="font-family: 宋体">【第</span>2</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">编写</span>Action<span style="font-family: 宋体">类</span></p><span style="font-family: 'Times New Roman'; font-size: 10.5pt"></span><span style="font-family: 宋体; font-size: 10.5pt">这一步和</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Struts1.x</span><span style="font-family: 宋体; font-size: 10.5pt">也必须进行。只是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Struts1.x</span><span style="font-family: 宋体; font-size: 10.5pt">中的动作类必须从</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Action</span><span style="font-family: 宋体; font-size: 10.5pt">类中继承，而</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Struts2.x</span><span style="font-family: 宋体; font-size: 10.5pt">的动作类需要从</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">com.opensymphony.xwork2.ActionSupport</span><span style="font-family: 宋体; font-size: 10.5pt">类继承。下面是计算两个整数代码和的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Action</span><span style="font-family: 宋体; font-size: 10.5pt">类，代码如下：</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)"> action;<br /><br /></span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)"> com.opensymphony.xwork2.ActionSupport;<br /><br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)"> FirstAction </span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)"> ActionSupport<br />{<br /></span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> operand1;<br /></span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> operand2;<br /><br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> String execute() </span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)"> Exception<br />{<br /></span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)"> (getSum() </span><span style="color: rgb(0,0,0)">&gt;=</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">) </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 如果代码数和是非负整数，跳到positive.jsp页面</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)">{<br /></span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">positive</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />}<br /></span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 如果代码数和是负整数，跳到negative.jsp页面</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)">{<br /></span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">negative</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />}<br />}<br /><br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> getOperand1()<br />{<br /></span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> operand1;<br />}<br /><br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)"> setOperand1(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> operand1)<br />{<br />System.out.println(operand1);<br /></span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.operand1 </span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)"> operand1;<br />}<br /><br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> getOperand2()<br />{<br /></span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> operand2;<br />} <br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)"> setOperand2(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> operand2)<br />{<br />System.out.println(operand2);<br /></span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.operand2 </span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)"> operand2;<br />}<br /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> getSum()<br />{<br /></span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> operand1 </span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)"> operand2; </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 计算两个整数的代码数和</span><span style="color: rgb(0,128,0)"><br /></span><span style="color: rgb(0,0,0)">}<br />}<br /></span></div>
<p><span style="font-family: 宋体">从上面的代码可以看出，动作类的一个特征就是要覆盖</span>execute<span style="font-family: 宋体">方法，只是</span>Struts2<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法没有参数了，而</span>Struts1.x<span style="font-family: 宋体">的</span>execute<span style="font-family: 宋体">方法有四个参数。而且</span>execute<span style="font-family: 宋体">方法的返回值也不同的。</span>Struts2<span style="font-family: 宋体">只返回一个</span>String<span style="font-family: 宋体">，用于表述执行结果（就是一个标志）。上面代码的其他部分将在下面讲解。</span><br /><br /></p>
<p><strong><span style="font-family: 宋体">【第</span>3</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">编写</span>ActionForm<span style="font-family: 宋体">类</span></p>
<p><span style="font-family: 宋体">在本例中当然需要使用</span>ActionForm<span style="font-family: 宋体">了。在</span>Struts1.x<span style="font-family: 宋体">中，必须要单独建立一个</span>ActionForm<span style="font-family: 宋体">类（或是定义一个动作</span>Form<span style="font-family: 宋体">），而在</span>Struts2<span style="font-family: 宋体">中</span>ActionForm<span style="font-family: 宋体">和</span>Action<span style="font-family: 宋体">已经二合一了。从第二步的代码可以看出，后面的部分就是应该写在</span>ActionForm<span style="font-family: 宋体">类中的内容。所以在第</span>2<span style="font-family: 宋体">步，本例的</span>ActionForm<span style="font-family: 宋体">类已经编写完成（就是</span>Action<span style="font-family: 宋体">类的后半部分）。</span></p>
<p><strong><span style="font-family: 宋体">【第</span>4</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">配置</span>Action<span style="font-family: 宋体">类</span></p><span style="font-family: 'Times New Roman'; font-size: 10.5pt"></span><span style="font-family: 宋体; font-size: 10.5pt">这一步</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts1.x</span><span style="font-family: 宋体; font-size: 10.5pt">和</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts2.x</span><span style="font-family: 宋体; font-size: 10.5pt">都是必须的，只是在</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts1.x</span><span style="font-family: 宋体; font-size: 10.5pt">中的配置文件一般叫</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts-config.xml</span><span style="font-family: 宋体; font-size: 10.5pt">（当然也可以是其他的文件名），而且一般放到</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">WEB-INF</span><span style="font-family: 宋体; font-size: 10.5pt">目录中。而在</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts2.x</span><span style="font-family: 宋体; font-size: 10.5pt">中的配置文件一般为</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts.xml</span><span style="font-family: 宋体; font-size: 10.5pt">，放到</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">WEB-INF"classes</span><span style="font-family: 宋体; font-size: 10.5pt">目录中。下面是在</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">struts.xml</span><span style="font-family: 宋体; font-size: 10.5pt">中配置动作类的代码：</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br /><br /></span>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><span style="color: rgb(0,0,255)">&lt;?</span><span style="color: rgb(255,0,255)">xml version="1.0" encoding="UTF-8" </span><span style="color: rgb(0,0,255)">?&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;!</span><span style="color: rgb(255,0,255)">DOCTYPE struts PUBLIC<br />"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">struts</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">package </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="struts2"</span><span style="color: rgb(255,0,0)"> namespace</span><span style="color: rgb(0,0,255)">="/mystruts"</span><span style="color: rgb(255,0,0)"><br />extends</span><span style="color: rgb(0,0,255)">="struts-default"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">action </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="sum"</span><span style="color: rgb(255,0,0)"> class</span><span style="color: rgb(0,0,255)">="action.FirstAction"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">result </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="positive"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">/positive.jsp</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">result</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">result </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="negative"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">/negative.jsp</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">result</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">action</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">package</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">struts</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span></div>
<p><span style="font-family: 宋体">在</span>&lt;struts&gt;<span style="font-family: 宋体">标签中可以有多个</span>&lt;package&gt;<span style="font-family: 宋体">，第一个</span>&lt;package&gt;<span style="font-family: 宋体">可以指定一个</span>Servlet<span style="font-family: 宋体">访问路径（不包括动作名），如&#8220;</span>/mystruts<span style="font-family: 宋体">&#8221;。</span>extends<span style="font-family: 宋体">属性继承一个默认的配置文件&#8220;</span>struts-default<span style="font-family: 宋体">&#8221;，一般都继承于它，大家可以先不去管它。</span>&lt;action&gt;<span style="font-family: 宋体">标签中的</span>name<span style="font-family: 宋体">属性表示动作名，</span>class<span style="font-family: 宋体">表示动作类名。</span></p>
<p>&lt;result&gt;<span style="font-family: 宋体">标签的</span>name<span style="font-family: 宋体">实际上就是</span>execute<span style="font-family: 宋体">方法返回的字符串，如果返回的是&#8220;</span>positive<span style="font-family: 宋体">&#8221;，就跳转到</span>positive.jsp<span style="font-family: 宋体">页面，如果是&#8220;</span>negative<span style="font-family: 宋体">&#8221;，就跳转到</span>negative.jsp<span style="font-family: 宋体">页面。在</span>&lt;struts&gt;<span style="font-family: 宋体">中可以有多个</span>&lt;package&gt;<span style="font-family: 宋体">，在</span>&lt;package&gt;<span style="font-family: 宋体">中可以有多个</span>&lt;action&gt;<span style="font-family: 宋体">。我们可以用如下的</span>URL<span style="font-family: 宋体">来访问这个动作：</span><br /><br />http://localhost:8080/struts2/mystruts/sum.action</p>
<p><span style="font-family: 宋体">注</span><span style="font-family: 宋体">：</span>Struts1.x<span style="font-family: 宋体">的动作一般都以</span>.do<span style="font-family: 宋体">结尾，而</span>Struts2<span style="font-family: 宋体">是以</span>.action<span style="font-family: 宋体">结尾。</span></p>
<p><strong><span style="font-family: 宋体">【第</span>5</strong><strong><span style="font-family: 宋体">步】</span></strong> <span style="font-family: 宋体">编写用户录入接口（</span>JSP<span style="font-family: 宋体">页面）</span></p>
<p style="text-indent: -18pt; margin-left: 39.75pt"><strong>1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span></strong><strong><span style="font-family: 宋体">主界面（</span>sum.jsp</strong><strong><span style="font-family: 宋体">）</span></strong></p>
<p style="margin-left: 21.75pt"><span style="font-family: 宋体">在</span>Web<span style="font-family: 宋体">根目录建立一个</span>sum.jsp<span style="font-family: 宋体">，代码如下：</span></p>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">&lt;%</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">@ page language</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">java</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> import</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">java.util.*</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> pageEncoding</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">GBK</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> </span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">&lt;%</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">@ taglib prefix</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">s</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> uri</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">/struts-tags</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">输入操作数</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />求代数和<br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">br</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:form </span><span style="color: rgb(255,0,0)">action</span><span style="color: rgb(0,0,255)">="mystruts/sum.action"</span><span style="color: rgb(255,0,0)"> </span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"> <br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:textfield </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="operand1"</span><span style="color: rgb(255,0,0)"> label</span><span style="color: rgb(0,0,255)">=" 操作数1"</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:textfield </span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="operand2"</span><span style="color: rgb(255,0,0)"> label</span><span style="color: rgb(0,0,255)">=" 操作数2"</span><span style="color: rgb(255,0,0)"> </span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"> <br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:submit </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">="代数和"</span><span style="color: rgb(255,0,0)"> </span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"> <br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">s:form</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span></div>
<p><span style="font-family: 宋体">在</span>sum.jsp<span style="font-family: 宋体">中使用了</span>Struts2<span style="font-family: 宋体">带的</span>tag<span style="font-family: 宋体">。在</span>Struts2<span style="font-family: 宋体">中已经将</span>Struts1.x<span style="font-family: 宋体">的好几个标签库都统一了，在</span>Struts2<span style="font-family: 宋体">中只有一个标签库</span>/struts-tags<span style="font-family: 宋体">。这里面包含了所有的</span>Struts2<span style="font-family: 宋体">标签。但使用</span>Struts2<span style="font-family: 宋体">的标签大家要注意一下。在</span>&lt;s:form&gt;<span style="font-family: 宋体">中最好都使用</span>Struts2<span style="font-family: 宋体">标签，尽量不要用</span>HTML<span style="font-family: 宋体">或普通文本，大家可以将</span>sum.jsp<span style="font-family: 宋体">的代码改为如下的形式，看看会出现什么效果：</span></p>
<p>... ...</p>
<p><span style="font-family: 宋体">求代数和</span></p>
<p>&lt;br/&gt;</p>
<p>&lt;s:form action="mystruts/sum.action" &gt; </p>
<p style="text-indent: 73.5pt"><span style="font-family: 宋体">操作数</span>1<span style="font-family: 宋体">：</span>&lt;s:textfield name="operand1" /&gt;&lt;br/&gt;</p>
<p style="text-indent: 73.5pt"><span style="font-family: 宋体">操作数</span>2<span style="font-family: 宋体">：</span>&lt;s:textfield name="operand1" /&gt;&lt;br/&gt;</p>
<p>&lt;s:submit value="<span style="font-family: 宋体">代数和</span>" /&gt; </p>
<p>&lt;/s:form&gt;</p>
<p>... ...</p>
<p><span style="font-family: 宋体">提示一下，在</span>&lt;s:form&gt;<span style="font-family: 宋体">中</span>Struts2<span style="font-family: 宋体">使用</span>&lt;table&gt;<span style="font-family: 宋体">定位。</span></p>
<p style="text-indent: -18pt; margin-left: 39.75pt"><strong>2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span></strong><strong>positive.jsp</strong></p>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">&lt;%</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">@ page language</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">java</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> import</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">java.util.*</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> pageEncoding</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">GBK</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">&lt;%</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">@ taglib prefix</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">s</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> uri</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">/struts-tags</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> </span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">显示代数和</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"> <br />代数和为非负整数</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">h1</span><span style="color: rgb(0,0,255)">&gt;&lt;</span><span style="color: rgb(128,0,0)">s:property </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">="sum"</span><span style="color: rgb(255,0,0)"> </span><span style="color: rgb(0,0,255)">/&gt;&lt;/</span><span style="color: rgb(128,0,0)">h1</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"> <br /></span></div>
<p style="text-indent: -18pt; margin-left: 39.75pt"><strong>3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> </span></strong><strong>negative.jsp</strong></p>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><span style="color: rgb(0,0,0)"></span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">&lt;%</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">@ page language</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">java</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> import</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">java.util.*</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> pageEncoding</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">GBK</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">&lt;%</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">@ taglib prefix</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">s</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> uri</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">=</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">/struts-tags</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)">"</span><span style="background-color: rgb(245,245,245); color: rgb(0,0,0)"> </span><span style="background-color: rgb(255,255,0); color: rgb(0,0,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">显示代数和</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />代数和为负整数</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">h1</span><span style="color: rgb(0,0,255)">&gt;&lt;</span><span style="color: rgb(128,0,0)">s:property </span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">="sum"</span><span style="color: rgb(255,0,0)"> </span><span style="color: rgb(0,0,255)">/&gt;&lt;/</span><span style="color: rgb(128,0,0)">h1</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br /></span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"> <br /></span></div><br />
<p><span style="font-family: 宋体">这两个</span>jsp<span style="font-family: 宋体">页面的实现代码基本一样，只使用了一个</span>&lt;s:property&gt;<span style="font-family: 宋体">标签来显示</span>Action<span style="font-family: 宋体">类中的</span>sum<span style="font-family: 宋体">属性值。</span>&lt;s:property&gt;<span style="font-family: 宋体">标签是从</span>request<span style="font-family: 宋体">对象中获得了一个对象中得到的</span>sum<span style="font-family: 宋体">属性，如我们可以使用如下的代码来代替</span>&lt;s:property value=&#8221;sum&#8221;/&gt;<span style="font-family: 宋体">：</span></p></span></div>
<p>&nbsp;</p> <img src ="http://www.blogjava.net/kelly/aggbug/408727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-09 11:41 <a href="http://www.blogjava.net/kelly/archive/2014/01/09/408727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ibatis+spring整合集成开发-【原创】</title><link>http://www.blogjava.net/kelly/archive/2014/01/09/408726.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 09 Jan 2014 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/09/408726.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408726.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/09/408726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408726.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Ibatis+spring整合集成开发&nbsp;前面的文档学习了ibatis的开发，这节学习ibatis和spring的整合集成开发。1.需要的开发包包括ibatis开发包和spring常用包&nbsp;&nbsp;2.创建POJO实体类，Area.java和Define_industry.javapackage com.ibatis.samp...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly/archive/2014/01/09/408726.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly/aggbug/408726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-09 11:38 <a href="http://www.blogjava.net/kelly/archive/2014/01/09/408726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2底层中如何将表单值传入Action</title><link>http://www.blogjava.net/kelly/archive/2014/01/09/408725.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 09 Jan 2014 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/09/408725.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408725.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/09/408725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408725.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">理解</span>ActionContext <span style="font-family: 宋体">、</span>ValueStack <span style="font-family: 宋体">、</span>Stack Context<br />ActionContext<br /><span style="font-family: 宋体">一次</span>Action<span style="font-family: 宋体">调用都会创建一个</span>ActionContext<br /><span style="font-family: 宋体">调用：</span>ActionContext context = ActionContext.getContext()<br /><br />ValueStack<br /><span style="font-family: 宋体">由</span>OGNL<span style="font-family: 宋体">框架实现</span><br /><span style="font-family: 宋体">可以把它简单的看作一个栈（</span>List<span style="font-family: 宋体">）</span> <span style="font-family: 宋体">。</span><br /><br />Stack Object<span style="font-family: 宋体">：放入</span>stack<span style="font-family: 宋体">中的对象，一般是</span>action<span style="font-family: 宋体">。</span><br />Stack Context<span style="font-family: 宋体">（</span>map<span style="font-family: 宋体">）：</span>stack<span style="font-family: 宋体">上下文，它包含一系列对象，包括</span>request/session/attr/application map<span style="font-family: 宋体">等。</span><br />EL<span style="font-family: 宋体">：存取对象的任意属性，调用对象的方法，</span><a href="http://cpro.baidu.com/cpro/ui/uijs.php?rs=1&amp;u=http%3A%2F%2Fblog%2Eknowsky%2Ecom%2F215426%2Ehtm&amp;p=baidu&amp;c=news&amp;n=10&amp;t=tpclicked3_hc&amp;q=sayyescpr&amp;k=%B1%E9%C0%FA&amp;k0=%B1%E9%C0%FA&amp;sid=bee39f90f303edf8&amp;ch=0&amp;tu=u1366390&amp;jk=dc060b87edc1d742&amp;cf=1&amp;fv=11&amp;stid=9&amp;urlid=0" target="_blank" mpid="0"><span style="font-family: 宋体; font-size: 11.5pt"><span>遍历</span></a></span><span style="font-family: 宋体">整个对象结&#8230;</span><br /><br />ActionContext<span style="font-family: 宋体">是</span>Action<span style="font-family: 宋体">上下文，可以得到</span>request session application<br />ValueStack<span style="font-family: 宋体">是值栈</span> <span style="font-family: 宋体">存放表单中的值</span><br />Stack Context <span style="font-family: 宋体">栈上下文</span> <span style="font-family: 宋体">也是用来存值的</span><br /><br /><br /><br /><span id="1_2"><span style="color: #2e2e2e; font-size: 11.5pt">struts</span></span>2<span style="font-family: 宋体">对</span>OGNL<span style="font-family: 宋体">上下文的概念又做了进一步扩充，在</span><span id="1_3"><span style="color: #2e2e2e; font-size: 11.5pt">struts</span></span>2<span style="font-family: 宋体">中，</span>OGNL<span style="font-family: 宋体">上下文通常如下所示：</span><br /><br />|--request&nbsp;<br /><br />|&nbsp;<br /><br />|--application&nbsp;<br /><br />|&nbsp;<br /><br />context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]&nbsp;<br /><br />|&nbsp;<br /><br />|--session&nbsp;<br /><br />|&nbsp;<br /><br />|--attr&nbsp;<br /><br />|&nbsp;<br /><br />|--parameters<br /><br /><br /><br /><br /><span style="font-family: 宋体">在</span><span id="1_4"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">中，采用标准命名的上下文</span>(Context)<span style="font-family: 宋体">来处理</span>OGNL<span style="font-family: 宋体">表达式。处理</span>OGNL<span style="font-family: 宋体">的顶级对象是一个</span>Map<span style="font-family: 宋体">（也叫</span>context map<span style="font-family: 宋体">），而</span>OGNL<span style="font-family: 宋体">在这个</span>context<span style="font-family: 宋体">中就是一个顶级对象</span>(root)<span style="font-family: 宋体">。在用法上，顶级对象的属性访问，是不需要任何标记前缀的。而其它非顶级的对象访问，需要使用</span>#<span style="font-family: 宋体">标记。</span><br /><span id="1_5"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">框架把</span>OGNL Context<span style="font-family: 宋体">设置为我们的</span>ActionContext<span style="font-family: 宋体">。并且</span>ValueStack<span style="font-family: 宋体">作为</span>OGNL<span style="font-family: 宋体">的根对象。除</span>value stack<span style="font-family: 宋体">之外，</span><span id="1_6"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">框架还把代表</span>application<span style="font-family: 宋体">、</span>session<span style="font-family: 宋体">、</span>request<span style="font-family: 宋体">这些对象的</span>Map<span style="font-family: 宋体">对象也放到</span>ActionContext<span style="font-family: 宋体">中去。（这也就是</span><span id="1_7"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">建议在</span>Action<span style="font-family: 宋体">类中不要直接访问</span>Servlet API<span style="font-family: 宋体">的原因，他可以通过</span>ActionContext<span style="font-family: 宋体">对象来部分代替这些（</span>Servlet API<span style="font-family: 宋体">）功能，以方便对</span>Action<span style="font-family: 宋体">类进行测试！）</span><br />Action<span style="font-family: 宋体">的实例，总是放到</span>value stack<span style="font-family: 宋体">中。因为</span>Action<span style="font-family: 宋体">放在</span>stack<span style="font-family: 宋体">中，而</span>stack<span style="font-family: 宋体">是</span>root(<span style="font-family: 宋体">根对象</span>)<span style="font-family: 宋体">，所以对</span>Action<span style="font-family: 宋体">中的属性的访问就可以省略</span>#<span style="font-family: 宋体">标记。但是，要访问</span>ActionContext<span style="font-family: 宋体">中其它对象的属性，就必须要带上</span>#<span style="font-family: 宋体">标记，以便让</span>OGNL<span style="font-family: 宋体">知道，不是从根对象，而是从其它对象中去寻找。</span><br /><span style="font-family: 宋体">那么访问</span>Action<span style="font-family: 宋体">中的属性的代码就可以这样写</span><br /><br />&lt;s:property value="postalCode"/&gt;<br /><span style="font-family: 宋体">其它</span>ActionContext<span style="font-family: 宋体">中的非根对象属性的访问要像下面这样写：</span><br />&lt;s:property value="#session.mySessionPropKey"/&gt; or<br />&lt;s:property value="#session['mySessionPropKey']"/&gt; or<br />&lt;s:property value="#request['myRequestPropKey']"/&gt;<br /><span style="font-family: 宋体">对</span>Collection<span style="font-family: 宋体">的处理，内容就很简单。</span><br />&lt;s:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" /&gt;<br /><span style="font-family: 宋体">这是处理</span>List<span style="font-family: 宋体">。这个代码在页面上建立一个下拉选项，内容是</span>list<span style="font-family: 宋体">中的内容，默认值是</span>name2.<br /><span style="font-family: 宋体">处理</span>map<br /><br />&lt;s:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}" /&gt;<br /><br /><span style="font-family: 宋体">需要注意的是，判断一个值是否在</span>collection<span style="font-family: 宋体">中。我们要使用</span>in<span style="font-family: 宋体">或者</span>not in<span style="font-family: 宋体">来处理。</span><br />&lt;s:if test="'foo' in {'foo','bar'}"&gt;<br />muhahaha<br />&lt;/s:if&gt;<br />&lt;s:else&gt;<br />boo<br />&lt;/s:else&gt;<br /><span style="font-family: 宋体">另外，可以使用通配符来选择</span>collection<span style="font-family: 宋体">对象的子集。</span><br />?<span style="font-family: 宋体">&#8212;&#8212;所有匹配选择逻辑的元素</span><br />^<span style="font-family: 宋体">&#8212;&#8212;只提取符合选择逻辑的第一个元素</span><br />$<span style="font-family: 宋体">&#8212;&#8212;只提取符合选择逻辑的最后一个元素</span><br />person.relatives.{? #this.gender == 'male'}</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">?</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">?</p>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体; color: red">值栈</span><span style="color: red">(ValueStack)</span>&nbsp;<br /><span id="1_8"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">将</span>OGNL<span style="font-family: 宋体">上下文设置为</span><span id="1_9"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">中的</span>ActionContext(<span style="font-family: 宋体">内部使用的仍然是</span>OgnlContext)<span style="font-family: 宋体">，并将值栈设为</span>OGNL<span style="font-family: 宋体">的根对象。</span>&nbsp;<br /><span style="font-family: 宋体">我们知道，</span>OGNL<span style="font-family: 宋体">上下文中的根对象可以直接访问，不需要使用任何特殊的&#8220;标记&#8221;，而引用上下文中的其他对象则需要使用&#8220;</span>#<span style="font-family: 宋体">&#8221;来标记。由于值栈是上下文中的根对象，因此可以直接访问。那么对于值栈中的对象该如何访问呢？</span><span id="1_10"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">提供了一个特殊的</span>OGNLPropertyAccessor<span style="font-family: 宋体">，它可以自动查找栈内的所有对象</span>(<span style="font-family: 宋体">从栈顶到栈底</span>)<span style="font-family: 宋体">，直接找到一个具有你所查找的属性的对象。也就是说，对于值栈中的任何对象都可以直接访问，而不需要使用&#8220;</span>#<span style="font-family: 宋体">&#8221;。</span>&nbsp;<br /><span style="font-family: 宋体">假设值栈中有两个对象：</span>student<span style="font-family: 宋体">和</span>employee<span style="font-family: 宋体">，两个对象都有</span>name<span style="font-family: 宋体">属性，</span>student<span style="font-family: 宋体">有学号属性</span>number<span style="font-family: 宋体">，而</span>employee<span style="font-family: 宋体">有薪水属性</span>salary<span style="font-family: 宋体">。</span>employee<span style="font-family: 宋体">先入栈，</span>student<span style="font-family: 宋体">后入栈，位于栈顶，那么对于表达式</span>name,<span style="font-family: 宋体">访问的就是</span>student<span style="font-family: 宋体">的</span>name<span style="font-family: 宋体">属性，因为</span>student<span style="font-family: 宋体">对象位于栈顶；表达式</span>salary<span style="font-family: 宋体">，访问的就是</span>employee<span style="font-family: 宋体">的</span>salary<span style="font-family: 宋体">属性。正如你所见，访问值栈中的对象属性或方法，无须指明对象，也不用&#8220;</span>#<span style="font-family: 宋体">&#8221;，就好像值栈中的对象都是</span>OGNL<span style="font-family: 宋体">上下文中的根对象一样。这就是</span><span id="1_11"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">在</span>OGNL<span style="font-family: 宋体">基础上做出的改进。</span><br /><br />&nbsp;<span style="font-family: 宋体; color: red">值栈中的</span><span style="color: red">Action</span><span style="font-family: 宋体; color: red">实例</span>&nbsp;<br /><span id="1_12"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">框架总是把</span>Action<span style="font-family: 宋体">实例放在栈顶。因为</span>Action<span style="font-family: 宋体">在值栈中，而值栈又是</span>OGNL<span style="font-family: 宋体">中的根，所以引用</span>Action<span style="font-family: 宋体">的属性可以省略&#8220;</span>#<span style="font-family: 宋体">&#8221;标记，这也是为什么我们在结果页面中可以直接访问</span>Action<span style="font-family: 宋体">的属性的原因。</span><br /><br />&nbsp;<span id="1_13"><span style="color: red; font-size: 11.5pt">Struts</span></span><span style="color: red">2</span><span style="font-family: 宋体; color: red">中的命名对象</span>&nbsp;<br /><span id="1_14"><span style="color: #2e2e2e; font-size: 11.5pt">Struts</span></span>2<span style="font-family: 宋体">还提供了一些命名对象，这些对象没有保存在值栈中，而是保存在</span>ActionContext<span style="font-family: 宋体">中，因此访问这些对象需要使用&#8220;</span>#<span style="font-family: 宋体">&#8221;标记。这些命名对象都是</span>Map<span style="font-family: 宋体">类型。</span>&nbsp;<br /><br /><span style="color: red">parameters</span>&nbsp;<br /><span style="font-family: 宋体">用于访问请求参数。如：</span>#parameters['id']<span style="font-family: 宋体">或</span>#parameters.id<span style="font-family: 宋体">，相当于调用了</span>HttpServletRequest<span style="font-family: 宋体">对象的</span>getParameter()<span style="font-family: 宋体">方法。</span>&nbsp;<br /><span style="font-family: 宋体">注意，</span>parameters<span style="font-family: 宋体">本质上是一个使用</span>HttpServletRequest<span style="font-family: 宋体">对象中的请求参数构造的</span>Map<span style="font-family: 宋体">对象，一量对象被创建</span>(<span style="font-family: 宋体">在调用</span>Action<span style="font-family: 宋体">实例之前就已经创建好了</span>)<span style="font-family: 宋体">，它和</span>HttpServletRequest<span style="font-family: 宋体">对象就没有了任何关系。</span>&nbsp;<br /><br /><span style="color: red">request</span>&nbsp;<br /><span style="font-family: 宋体">用于访问请求属性。如：</span>#request['user']<span style="font-family: 宋体">或</span>#request.user<span style="font-family: 宋体">，相当于调用了</span>HttpServletRequest<span style="font-family: 宋体">对象的</span>getAttribute()<span style="font-family: 宋体">方法。</span>&nbsp;<br /><br /><span style="color: red">session</span>&nbsp;<br /><span style="font-family: 宋体">用于访问</span>session<span style="font-family: 宋体">属性。如：</span>#session['user']<span style="font-family: 宋体">或</span>#session.user<span style="font-family: 宋体">，相当于调用了</span>HttpSession<span style="font-family: 宋体">对象的</span>getAttribute()<span style="font-family: 宋体">方法。</span>&nbsp;<br /><br /><span style="color: red">application</span>&nbsp;<br /><span style="font-family: 宋体">用于访问</span>application<span style="font-family: 宋体">属性。如：</span>#application['user']<span style="font-family: 宋体">或</span>#application.user<span style="font-family: 宋体">，相当于调用了</span>ServletContext<span style="font-family: 宋体">的</span>getAttribute()<span style="font-family: 宋体">方法。</span>&nbsp;<br /><br />attr&nbsp;<br /><span style="font-family: 宋体">如果</span>PageContext<span style="font-family: 宋体">可用，则访问</span>PageContext<span style="font-family: 宋体">，否则依次搜索</span>request<span style="font-family: 宋体">、</span>session<span style="font-family: 宋体">和</span>application<span style="font-family: 宋体">对象。<br /><br /></p><pre style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/24px arial, 'courier new', courier, 宋体, monospace; word-wrap: break-word; white-space: pre-wrap; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" accuse="aRA">假设你的Action类中有变量String password; 要想获取页面中传过来的password，必须为password设置get 和set 方法。当你的页面进入Action时，ActionContext（Action上下文）通过set方法获取password的值并压入值栈栈顶，同时request也获取到password的值，同时也如堆栈，session等对象的值也被压入堆栈，ActionContext中的值在页面中可以直接用&lt;s:porperty value="password"&gt;取值显示，而request中存储的password通过&lt;s:porperty value="#request.password"&gt;或者${password}取值。即struts是通过一个值栈来存储所有对象和ActionContext中的值得。ActionContext为栈顶对象，也称跟对象，ActionContext的值可以直接用变量名取，而其他的变量需要用#变量名取值。</pre>
<p style="widows: 2; orphans: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /></span></p> <img src ="http://www.blogjava.net/kelly/aggbug/408725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-09 11:20 <a href="http://www.blogjava.net/kelly/archive/2014/01/09/408725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGNL表达式struts2标签“%，#，$”</title><link>http://www.blogjava.net/kelly/archive/2014/01/08/408679.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Wed, 08 Jan 2014 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/08/408679.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408679.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/08/408679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408679.html</trackback:ping><description><![CDATA[<ol style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><li><span>一、什么是OGNL，有什么特点？ &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>OGNL（Object-Graph&nbsp;<wbr>Navigation&nbsp;<wbr>Language），大概可以理解为：对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点：&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">1</font></span><span>、支持对象方法调用，形式如：objName.methodName()； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">2</font></span><span>、支持类静态的方法调用和值访问，表达式的格式为@[类全名（包括包路）]@[方法名&nbsp;<wbr>|&nbsp;<wbr>&nbsp;<wbr>值名]，例如： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#646464">@java</font></span><span>.lang.String</span><span><font color="#646464">@format</font></span><span>(</span><span><font color="#0000ff">'foo&nbsp;<wbr>%s'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'bar'</font></span><span>)或</span><span><font color="#646464">@tutorial</font></span><span>.MyConstant</span><span><font color="#646464">@APP_NAME</font></span><span>； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">3</font></span><span>、支持赋值操作和表达式串联，例如： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>price=</span><span><font color="#c00000">100</font></span><span>,&nbsp;<wbr>discount=</span><span><font color="#c00000">0.8</font></span><span>,&nbsp;<wbr>calculatePrice()，这个表达式会返回</span><span><font color="#c00000">80</font></span><span>； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">4</font></span><span>、访问OGNL上下文（OGNL&nbsp;<wbr>context）和ActionContext； &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">5</font></span><span>、操作集合对象。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>二、使用OGNL表达式 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>OGNL要结合struts标签来使用。由于比较灵活，也容易把人给弄晕，尤其是&#8220;%&#8221;、&#8220;#&#8221;、&#8220;$&#8221;这三个符号的使用。由于$广泛应用于EL中，这里重点写%和#符号的用法。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">1</font></span><span>、&#8220;#&#8221;符号有三种用途： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">1</font></span><span>)、访问非根对象（struts中值栈为根对象）如OGNL上下文和Action上下文，#相当于ActionContext.getContext()；下表有几个ActionContext中有用的属性： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>名称 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>作用 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>例子 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>parameters &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前HTTP请求参数的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#parameters.id[</span><span><font color="#c00000">0</font></span><span>]作用相当于request.getParameter(</span><span><font color="#0000ff">"id"</font></span><span>)&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>request &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前HttpServletRequest的属性（attribute)的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#request.userName相当于request.getAttribute(</span><span><font color="#0000ff">"userName"</font></span><span>)&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>session &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前HttpSession的属性（attribute）的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#session.userName相当于session.getAttribute(</span><span><font color="#0000ff">"userName"</font></span><span>)&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>application &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>包含当前应用的ServletContext的属性（attribute）的Map &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>#application.userName相当于application.getAttribute(</span><span><font color="#0000ff">"userName"</font></span><span>)&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>注：attr&nbsp;<wbr>用于按request&nbsp;<wbr>&gt;&nbsp;<wbr>session&nbsp;<wbr>&gt;&nbsp;<wbr>application顺序访问其属性（attribute），#attr.userName相当于按顺序在以上三个范围（scope）内读取userName属性，直到找到为止。用于过滤和投影（projecting)集合，如books.{?#</span><span><strong><font color="#7f0055">this</font></strong></span><span>.price&lt;</span><span><font color="#c00000">100</font></span><span>}；构造Map，如#{</span><span><font color="#0000ff">'foo1'</font></span><span>:</span><span><font color="#0000ff">'bar1'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'foo2'</font></span><span>:</span><span><font color="#0000ff">'bar2'</font></span><span>}。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">2</font></span><span>)、用于过滤和投影（projecting)集合，如:&nbsp;<wbr>books.{?#</span><span><strong><font color="#7f0055">this</font></strong></span><span>.price&gt;</span><span><font color="#c00000">35</font></span><span>}&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>books.{?#</span><span><strong><font color="#7f0055">this</font></strong></span><span>.price&gt;</span><span><font color="#c00000">35</font></span><span>} &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">3</font></span><span>)、构造Map，如:&nbsp;<wbr>#{</span><span><font color="#0000ff">'foo1'</font></span><span>:</span><span><font color="#0000ff">'bar1'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'foo2'</font></span><span>:</span><span><font color="#0000ff">'bar2'</font></span><span>}&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>#{</span><span><font color="#0000ff">'foo1'</font></span><span>:</span><span><font color="#0000ff">'bar1'</font></span><span>,&nbsp;<wbr></span><span><font color="#0000ff">'foo2'</font></span><span>:</span><span><font color="#0000ff">'bar2'</font></span><span>}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写：&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['foo1']"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['foo1']"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">2</font></span><span>、&#8220;%&#8221;符号的用途是在标签的属性值被理解为字符串类型时，告诉执行环境%{}里的是OGNL表达式。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>这是一开始最让我不能理解的符号，原因是一些相关资源在表述时不太准备，经过一翻痛苦的探索，终于明白了它的用途。实际上就是让被理解为字符串的表达式，被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能，例如&nbsp;<wbr>： &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>eval_r(</span><span><font color="#0000ff">"document.all.div"</font></span><span>+index)&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>eval_r(</span><span><font color="#0000ff">"document.all.div"</font></span><span>+index) &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>当index变量为</span><span><font color="#c00000">1</font></span><span>时，语句就会被当作var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>document.all.div1&nbsp;<wbr>&nbsp;<wbr>var&nbsp;<wbr>oDiv&nbsp;<wbr>=&nbsp;<wbr>document.all.div1来执行。%{}就是起这个作用。举例：&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:set&nbsp;<wbr>name=</span><span><font color="#0000ff">"myMap"</font></span><span>&nbsp;<wbr>value=</span><span><font color="#0000ff">"#{'key1':'value1','key2':'value2'}"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>&nbsp;<wbr>/&gt;&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:set&nbsp;<wbr>name=</span><span><font color="#0000ff">"myMap"</font></span><span>&nbsp;<wbr>value=</span><span><font color="#0000ff">"#{'key1':'value1','key2':'value2'}"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:property&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>上面的代码第</span><span><font color="#c00000">2</font></span><span>行会在页面上输出&#8220;value1&#8221;，而第</span><span><font color="#c00000">3</font></span><span>行则会输出</span><span><font color="#0000ff">"#myMap['key1']"</font></span><span>这么一个字符串。&nbsp;<wbr>如果将第</span><span><font color="#c00000">3</font></span><span>行改写成这样：&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"%{#myMap['key1']}"</font></span><span>/&gt;&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;s:url&nbsp;<wbr>value=</span><span><font color="#0000ff">"%{#myMap['key1']}"</font></span><span>/&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>则输出为&#8220;value1&#8221;。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签&#8220;看不懂&#8221;类似&#8220;#myMap[</span><span><font color="#0000ff">'key1'</font></span><span>]&#8221;的语句时，就要用%{}来把这括进去，&#8220;翻译&#8221;一下了。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span><font color="#c00000">3</font></span><span>、&#8220;$&#8221;有两种用途 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">1</font></span><span>)、在国际化资源文件中，引用OGNL表达式。 &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>(</span><span><font color="#c00000">2</font></span><span>)、在Struts&nbsp;<wbr></span><span><font color="#c00000">2</font></span><span>配置文件中，引用OGNL表达式：&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;action&nbsp;<wbr>name=</span><span><font color="#0000ff">"saveUser"</font></span><span>&nbsp;<wbr></span><span><strong><font color="#7f0055">class</font></strong></span><span>=</span><span><font color="#0000ff">"userAction"</font></span><span>&nbsp;<wbr>method=</span><span><font color="#0000ff">"save"</font></span><span>&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;result&nbsp;<wbr>type=</span><span><font color="#0000ff">"redirect"</font></span><span>&gt;listUser.action?msg=${msg}&lt;/result&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;/action&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;action&nbsp;<wbr>name=</span><span><font color="#0000ff">"saveUser"</font></span><span>&nbsp;<wbr></span><span><strong><font color="#7f0055">class</font></strong></span><span>=</span><span><font color="#0000ff">"userAction"</font></span><span>&nbsp;<wbr>method=</span><span><font color="#0000ff">"save"</font></span><span>&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;result&nbsp;<wbr>type=</span><span><font color="#0000ff">"redirect"</font></span><span>&gt;listUser.action?msg=${msg}&lt;/result&gt; &nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&nbsp;<wbr>&nbsp;<wbr></span></li><li><span>&lt;/action&gt;&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span><br /></span></li></ol><br class="Apple-interchange-newline" /> <img src ="http://www.blogjava.net/kelly/aggbug/408679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-08 13:58 <a href="http://www.blogjava.net/kelly/archive/2014/01/08/408679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ibatis介绍与用例-[原创]</title><link>http://www.blogjava.net/kelly/archive/2014/01/07/408640.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Tue, 07 Jan 2014 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/07/408640.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408640.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/07/408640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408640.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ibatis介绍与用例&nbsp;一、介绍ibatis 是一种&#8220;半自动化&#8221;的ORM实现。iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性。iBATIS不同于一般的OR映射框架(eg:hibernate)。OR映射框架，将数据库表、字段等映射到类、属性，那是一种元数据(meta-data)映射。iBATIS则是将SQL查询的参数和结果...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly/archive/2014/01/07/408640.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly/aggbug/408640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-07 15:50 <a href="http://www.blogjava.net/kelly/archive/2014/01/07/408640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入学习Struts2-转</title><link>http://www.blogjava.net/kelly/archive/2014/01/07/408638.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Tue, 07 Jan 2014 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2014/01/07/408638.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408638.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2014/01/07/408638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408638.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 深入Struts2的配置文件本部分主要介绍struts.xml的常用配置。1.1.&nbsp;&nbsp;&nbsp;&nbsp;包配置：Struts2框架中核心组件就是Action、拦截器等，Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。在struts.xml文件中package元素用于定义包配置，每个pack...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly/archive/2014/01/07/408638.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly/aggbug/408638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2014-01-07 15:39 <a href="http://www.blogjava.net/kelly/archive/2014/01/07/408638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts1入门实例（简单登录）-转</title><link>http://www.blogjava.net/kelly/archive/2013/12/27/408117.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Fri, 27 Dec 2013 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2013/12/27/408117.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/408117.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2013/12/27/408117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/408117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/408117.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首页要在web.xml中添加相应的struts配置：&lt;servlet&gt;        &lt;servlet-name&gt;action&lt;/servlet-name&gt;        &lt;servlet-class&gt;            org.apache.struts.action.ActionServlet        &lt;/servle...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly/archive/2013/12/27/408117.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly/aggbug/408117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2013-12-27 14:56 <a href="http://www.blogjava.net/kelly/archive/2013/12/27/408117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis+spring WEB-INF\SqlMapConfig.xml (系统找不到指定的路径。) -转</title><link>http://www.blogjava.net/kelly/archive/2013/12/05/407249.html</link><dc:creator>kelly</dc:creator><author>kelly</author><pubDate>Thu, 05 Dec 2013 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/kelly/archive/2013/12/05/407249.html</guid><wfw:comment>http://www.blogjava.net/kelly/comments/407249.html</wfw:comment><comments>http://www.blogjava.net/kelly/archive/2013/12/05/407249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly/comments/commentRss/407249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly/services/trackbacks/407249.html</trackback:ping><description><![CDATA[改变applicationContext.xml中<br /><p>&lt;bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt; <br /><span style="white-space: pre;"></span>&lt;property name="configLocation"&gt; <br /><span style="white-space: pre;"></span>&lt;value&gt;classpath:SqlMapConfig.xml&lt;/value&gt; <br /><span style="white-space: pre;"></span>&lt;/property&gt; <br /><span style="white-space: pre;"></span>&lt;property name="dataSource"&gt; <br /><span style="white-space: pre;"></span>&lt;ref bean="dataSource"/&gt; <br /><span style="white-space: pre;"></span>&lt;/property&gt; <br />&lt; /bean&gt;<br /></p><p>中的</p><p><span style="white-space: pre;"></span>&lt;value&gt;classpath:SqlMapConfig.xml&lt;/value&gt; <br />然后把SqlMapConfig.xml放到src下面 </p> <img src ="http://www.blogjava.net/kelly/aggbug/407249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly/" target="_blank">kelly</a> 2013-12-05 13:39 <a href="http://www.blogjava.net/kelly/archive/2013/12/05/407249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>