1.struts2框架配置文件
struts2的配置以struts.xml为主要配置文件,该文件配置了URL和java类之间的对应关系,struts支持多个配置文件并存,所以某个模块的配置文件可以新建一个struts-模块名.xml,并在此文件中进行配置。
1.1.png
图 1.1
如图1.1所示,该包下继承来自struts的默认配置文件。action节点的name和URL前缀名是相对应的。例如:
index.jsp中的index对应于
请注意:这里是严格区分大小写的
class是指定由哪个类来进行处理;method是指调用了该类的哪个方法,如果不写,则自动调用execute()方法;result则配置了执行方法后如何跳转,struts2已经内置了5种跳转方式:SUCCESS、ERROR、INPUT、NONE、LOGIN分别对应result的name属性为success、error、input、none、login的情况 ,如果想自定义返回名,只需要返回的字符串和这里的name属性相对应就可以了,如果不配置name属性默认为success;result的type属性规定了跳转方式,一般项目使用两种dipatcher和chain。dispatcher主要负责跳转jsp,chain主要负责跳转action。
在需要验证的action类的同一级目录增加校验文件,命名规范:类名-请求名-validation.xml,如图1.2所示:
图1.2
图中演示了如何通过配置来增加表单的非空校验。
国际化配置文件在 src/main/resource/messageResource*.properties
命名规范:baseName_语言代码_国家代码.properties
Struts.xml中配置了baseName为messageResource
中文配置文件为messageResource_zh_CN.properties
英文配置文件为messageResource_en_US.properties
默认配置文件为messageResource.properties(当找不到对应语言配置文件或者在配置文件中找不到对应的key时,到此文件中找)
1、页面中使用国际化
<s:text name="loginPage"/>
2、action中使用国际化
getText(“loginPage”);
3、国际化的动态传参
getText(“loginPage”,new String[]{“烽火星空”});
动态传参需要先创建一个string数组,把这个数组作为参数传给getText方法,国际化配置文件中
loginPage = {0},您好!
程序会把{0}替换成数组中下标为0的字符串,{1}会获取数组中下标为1的字符串,以此类推。
2.struts2+spring框架配置文件
在web.xml中配置以下代码,在项目启动时,就可将src目录下以applicationContext开头的spring配置文件加载进来。
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
applicationContext.xml负责系统级配置
applicationContext-aciton.xml负责struts2中的action层配置
applicationContext-service.xml负责具体逻辑层配置
applicationContext-dao.xml负责数据库连接层配置
如图2.1所示
图2.1
在applicationContext-action.xml配置文件中配置action层,同时引用service层,一个bean包含一个action文件,其id将在struts.xml文件中被引用。
在单独struts2框架里面我们的action文件代码如下:
<action name="login" class="com.fh.test.pojo.LoginAction" method="checkUser">
<result name="success">/welcome.jsp</result>
<result name="input">/index.jsp</result>
</action>
login所对应的class是Action类
而在struts2和spring整合里面,代码如下:
<action name="login" class="loginAction">
<result name="success">/welcome.jsp</result>
<result name="input">/index.jsp</result>
</action>
这里面的class代码的loginAction是applicationContext-action.xml中的同名bean,如下所示:
<bean name="loginAction" class="com.fh.test.action.LoginAction" scope="prototype">
<property name="loginService" ref="loginService"/>
</bean>
在上面这段代码中将loginAction和com.fh.test.action.LoginAction类对应了起来,其中的子property元素自动填充名为loginService的属性,即构造逻辑层的实例。
注意:spring的IOC(Inversion of Control)特性,是调用了属性的set方法
而ref="loginService"这里调用了名为loginService的bean,该bean是属于逻辑层代码,所以配置在applicationContext-service.xml中,如下:
<bean id="loginService" class="com.fh.test.service.impl.LoginService">
<property name="loginDAO" ref="loginDAOImpl"/>
</bean>
同样该逻辑层的bean自动填充dao层的实例,引入名为loginDAOImpl的bean,该bean配置在applicationContext-dao.xml中,如下:
<bean id="loginDAOImpl" class="com.fh.test.dao.impl.LoginDAO"/>
经过这一系列的配置,便完成了action类的调用。
3.spring+iBATIS框架配置文件
配置iBATIS数据源和第三方proxool连接池
利用spring读取配置文件,并利用配置文件的信息初始化连接池
如下:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.properties</value>
</property>
</bean>
value元素中所指是读取src下的jdbc.properties配置文件。
<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource"
destroy-method="close">
<property name="driver">
<value>${jdbc.driver}</value>
</property>
<!-- sqlServer需要添加的字段 -->
<property name="delegateProperties">
<value>user=${jdbc.username},password=${jdbc.password}</value>
</property>
<property name="driverUrl">
<value>${jdbc.url}</value>
</property>
<property name="user">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="alias">
<value>${jdbc.alias}</value>
</property>
<property name="houseKeepingSleepTime">
<value>${jdbc.houseKeepingSleepTime}</value>
</property>
<property name="prototypeCount">
<value>${jdbc.prototypeCount}</value>
</property>
<property name="maximumConnectionCount">
<value>${jdbc.maximumConnectionCount}</value>
</property>
<property name="minimumConnectionCount">
<value>${jdbc.minimumConnectionCount}</value>
</property>
</bean>
如上即是利用${}来读取配置文件中的配置项,从而对proxool连接池进行初始化。
<bean id="client" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
<property name="mappingLocations">
<value>classpath:sqlmap/sqlserver/*.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
如上所示,利用spring自带的iBATIS工厂类进行实例化,构造名为client的bean,该构造中指定了SqlMapConfig.xml为iBATIS配置文件,sqlmap/sqlserver下所有的xml文件为sql配置文件。数据源即是之前配置的proxool连接池。
在sqlMapConfig.xml中配置了<sqlMap resource="common.xml"/>,即引用了common.xml文件,,在这个文件中定义别名和类的全限定名之间的映射关系,如下:
<typeAlias alias="User" type="com.fh.test.pojo.User" />
使用这个配置后,在sql配置文件中传参和出参就只需要写别名就行了,简化了开发
图3.1
在src /sqlmap目录下对应了各数据库的文件夹,每个文件夹下都是按模块划分的配置文件,新增一个模块时只需要在对应数据库的文件夹下新建一个配置文件,以模块名命名。
<sqlMap namespace="login">
<select id="getUser" parameterClass="java.lang.String"
resultClass="User">
SELECT PerAdd AS perAdd,
Posi_Name AS posiName,
Emp_Field AS empField,
PerName AS perName,
Telphone AS telephone,
IMSI,
Password AS password,
User_Group AS userGroup
FROM Login_Check
WHERE PerAdd = #userID#
</select>
</sqlMap>
id定义了这条语句的唯一标示符,parameterClass定义了传入的类型,这里使用的是java的基本类-字符串类。resultClass定义了返回类型,这里使用了别名,具体对应的类在common.xml中查询。这里有一个动态参数#userID#,即是传入的字符串对象,方法会把查询出的结果封装成对象返回,在方法调用处接收即可。
spring中的applicationContext-dao.xml配置如下图:
<bean id="baseDAO" abstract="true" class="com.fh.test.dao.impl.BaseDAO">
<property name="client" ref="client"/>
</bean>
<bean id="loginDAOImpl" class="com.fh.test.dao.impl.LoginDAO" parent="baseDAO"/>
使用名为baseDAO的bean将applicationContext.xml中配置的client填充进去,并加上abstract="true",使其不能直接实例化,而是作为所有dao的父类,在其它dao的bean上加上parent="baseDAO"。
在原有dao的类中要继承baseDAO,利用client实例调用相应的sql语句,并将结果自动构造成User类的对象
user = (User)this.getClient().queryForObject("login.getUser",username);
login.getUser是指命名空间为login,id为getUser的配置信息。