Springside学习笔记
数据层:
第一步:我们要配置好数据源:
在src/resources文件夹下面创建jdbc.properties文件
(这里我们使用mysql作为我们的数据库)
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc/:mysql/://localhost/message?useUnicode/=true&characterEncoding/=utf-8
jdbc.username=root
jdbc.password=123
配置好数据库驱动类,url,以及帐号和密码
将配置好的数据源配置到spring框架中
1).我们将该数据源文件配置成一个属性文件作读入
以bean的形式设置在applicationContext.xml文件中
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:config/jdbc.properties</value>
</list>
</property>
</bean>
2)在spring的另一个配置文件dataAccessContext-ibatis.xml中
我们利用上面的数据源,配置数据库连接池
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
注意:使用dbcp数据库连接池,相应的Jar包要引入进来
3).将此dataSourc配置成另一个bean 的dataSource属性
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:sql-map-config.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
注意:上面的bean中的configLocation的值设为:sql-map-config.xml,这个文件中不配置数据源,但里面配好了一些实体(POJO)映射配置文件.如
<sqlMapConfig>
<!-- 添加对象映射文件 -->
<sqlMap resource="com/ib/message/model/mapping/message.xml" />
</sqlMapConfig>
而真正设置数据源则由它的dataSource属性指定,这个属性又由上面的dataSource相对引用面得到.
第二步:事务管理:
1.iBatis事务
在iBatis中注入TransactionManager(即事务管理器)
(dataAccessContext-ibatis.xml)
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
2.spring框架中事务管理(applicationContext.xml文件中)
<!-- 支持 @Transactional 标记 -->
<tx:annotation-driven/>
<!-- 基本事务定义,使用transactionManager作事务管理,默认get*方法的事务为readonly,其余方法按默认设置.
默认的设置请参考Spring文档事务一章. -->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 支持 @AspectJ 标记-->
<aop:aspectj-autoproxy/>
<!-- 以AspectJ方式 定义 AOP -->
<aop:config proxy-target-class="true">
<!-- 注意,请把第2个*号换为项目package -->
<aop:advisor pointcut="execution(* *..service.*Manager.*(..))" advice-ref="txAdvice"/>
<aop:advisor pointcut="execution(* org.springside.core.dao.*Dao.*(..))" advice-ref="txAdvice"/>
</aop:config>
然后在serviceContext.xml文件中就可以注册ServerManager类了
<!-- 这里定义*Manager的Bean -->
<bean
id="messageManager"
class="com.ib.message.service.MessageManager"/>
第三步:业务方法
分层结构:
在第一层中定义Message.java实体类,也就是一些getter/setter方法集
类要实现Serializable接口
。。。。。。。。。。。。。。。。
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
。。。。。。。。。。。。。。。
在第二层:
定义message.xml映射配置文件
这个是属于iBatis框架中的重要文件
里面可以定义select,insert,update,delete,还有存储过程等
预先写好该配置SQL文件,为下面提拱使用
例如:
<sqlMap namespace="Message">
<insert id="com.ib.message.model.Message.insert" parameterClass="com.ib.message.model.Message">
insert into message (name,email,title,time,content) value
(#name#,#email#,#title#,#time#,#content#)
</insert>
</sqlMap>
注意要对数据库中对应的表相一致,符合SQL语言的规范等
第三层:服务类包
这里面的类继承了org.springside.core.dao.IbatisEntityDao抽象类
是一些业务逻辑方法,为下层的action包提拱实现方法.
例如: (下面是一个查询方法)---
public PageDisplayItem Search(String searchStr,long currPage) {
long totalRecord = 0;
Long userCount = (Long) getSqlMapClientTemplate().queryForObject(
"com.ib.message.model.Message.searchCount",searchStr);
if (userCount != null)
totalRecord = userCount;
PageDisplayItem page = PageUtils.getPageDisplayItem(totalRecord,
currPage, 5);
Map map = new HashMap();
map.put("recordBegin", new Long(page.getRecordBegin() - 1));
map.put("recordLimit", new Long(page.getRecordLimit()));
map.put("searchStr", searchStr);
page.setList(getSqlMapClientTemplate().queryForList(
"com.ib.message.model.Message.search", map));
return page;
}
下一层:util是一个实体工具类,是一些辅助的类
如分页的类,字符转换类等
再有一层:Action包
例如:MessageAction类
public MessageManager messageManager;
public void setMessageManager(MessageManager messageManager) {
this.messageManager = messageManager;}
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Message message = new Message();
message
.setName(WebRequestUtils
.getStringParameterTrim(request, "name"));
message.setTitle(WebRequestUtils.getStringParameterTrim(request,
"title"));
message.setEmail(WebRequestUtils.getStringParameterTrim(request,
"email"));
message.setcontent(WebRequestUtils.getStringParameterTrim(request,
"content"));
message.setTime(new Date());
// System.out.println(message.getTime());
messageManager.insert(message);
// System.out.println("has insert one message!");
return mapping.findForward(SUCCESS);
}
上面是insert操作的action部分,实现插入记录到Message表中,根据插入情况,跳转到相对应的网页中.
Form层,提拱给action使用.
有getter/setter,还有reset,validate函数方法.
第四步:重要的配置文件
Struts-config.xml
添加Struts框架对spring的支持:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
保证提交的内容能被Spring截获
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor">
</controller>
添加validation验证框架:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
对应到:
这两个文件
加载一些资源包:
<message-resources parameter="i18n/messages"/>
Spring-config-page.xml配置文件
配置一些bean,即可对应以前struts-config里面的一些action.
例如:
<bean name="/page/message" class="com.ib.message.web.action.MessageAction" />
而在struts-config_page.xml文件中配置:
<action path="/page/message" name="messageForm" scope="request"
parameter="method" validate="false">
<forward name="list" path="/WEB-INF/pages/page/messageList.jsp" />
<forward name="edit" path="/WEB-INF/pages/page/messageForm.jsp" />
<forward name="searchList" path="/WEB-INF/pages/page/messageSearchList.jsp" />
<forward name="success" path="/page/message.do" redirect="true" />
</action>
注意:这个action标记可以配置在strut-config.xml文件中,但为安全和将一些配置属性放置到其他的配置文件考虑.而且这个action下面有四个跳转指令
如何让spring框架认识到Spring_config_page.xml呢.
有办法:在action-servlet.xml文件中:
<!-- 按模块导入Spring Action Config-->
<import resource="modules/spring-config-admin.xml" />
<import resource="modules/spring-config-page.xml" />
还有如何让Struts Action认识到struts-config.xml,struts-config-admin.xml,struts-config-page.xml
方法:
在web.xml文件中进行以下配置:
<servlet>
<servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml,
/WEB-INF/modules/struts-config-admin.xml,
/WEB-INF/modules/struts-config-page.xml
</param-value>
</init-param>
………………………………………………………………………..
</servlet>
在web.xml中还有一些重要的设置:同struts-config.xml中相对应
<!-- Spring ApplicationContext配置文件的路径。可使用通配符,多个路径用逗号分隔。
此参数用于后面的“Spring-Context loader” -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<!--Spring ApplicationContext 载入 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Error Page定义
<error-page>
<error-code>500</error-code>
<location>/commons/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/commons/404.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/commons/403.jsp</location>
</error-page>
session超时定义,单位为分钟
<session-config>
<session-timeout>10</session-timeout>
</session-config>
中文乱码问题的解决:
<!-- 著名 Character Encoding filter -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- Spring 刷新Introspector防止内存泄露 -->
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
第五步:jsp,css,js等文件
注意这里的jsp不可以直接被访问到
要通过相对路径访问,如http://localhost:8080/Message/page/message.do
分析这个URL,注意,Message为这个项目的根路径名:
而/page/message为path="/page/message"即为path的属性值.
默认情况下为:
<forward name="success" path="/page/message.do" redirect="true" />
跳转到这个地方.
Default.css配置一些样式表,为jsp文件提拱一些友好的风格
第六步:日志文件----log4j.properties
# This is the configuring for logging displayed in the Application Server
log4j.rootCategory=INFO, stdout,logfile
#stdout configure
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %p [%c] - <%m>%n
#logfile configure
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=../logs/@[email protected]
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= %d %p [%c] - <%m>%n
# Control logging for other open source packages
# Changing the log level to DEBUG when debug
log4j.logger.org.springframework=WARN
# Changing the log level to DEBUG will display SQL Hibernate generated
log4j.logger.org.hibernate=WARN
log4j.logger.org.hibernate.SQL=ERROR
log4j.logger.org.hibernate.cache=ERROR
log4j.logger.net.sf.ehcache=ERROR
…………………………..