学习日记(四)针对ssh的理解
来源:互联网 发布:广州聚友网络客服电话 编辑:程序博客网 时间:2024/06/02 04:18
一、从已有项目代码了解ssh
(这里说的是struts1)
首先,默认创建好了一个项目,你去了解其中的业务流程。拿到一个项目,先从web.xml开始了解。了解其加载顺序:ServletContext -> listener -> filter -> servlet
同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet
对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。
servlet 同 filter 类似,此处不再赘述。
由此,可以看出,web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的(更多关于web.xml的我是从web.xml详解了解)。
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value></context-param>
由classpath,跳转到查看spring的管理层面。
spring要配置数据访问层信息。
<bean id="statChannelChartBean" class="com.cic.cooperator.flashchart.StatChannelLine" scope="prototype"> <property name="coopCoreService"> <ref local="coopCoreService"/> </property> </bean>
spring要进行一些bean的管理,即配置控制器并为其注入业务逻辑层组件。
<bean name="/channelV3" class="com.cic.cooperator.action.V3.ChannelAction"><property name="coopCoreService"><ref bean="coopCoreService"/>业务逻辑层组件</property></bean>
其中id 和 name的区别:
id是唯一标识bean.不能用特殊字符:×#@ ,不能用数字开头。在bean引用的时候只能有id指向你需要的bean
name 可以用特殊字符,并且一个bean可以用多个名称:name=“bean1,bean2,bean3” ,用逗号隔开。如果没有id,则name的第一个名称默认是id
通过id和name都可以取出该Bean.
<bean id=“thisbean” name=“bean1,bean2,bean3” class=“org.example.Dao" />BeanFactory factory=new XmlBeanFactory(new ClassPathResource("config.xml"));Dao dao=(Dao)factory.getBean("thisbean");Dao dao1=(Dao)factory.getBean("bean1");Dao dao2=(Dao)factory.getBean("bean2"); ......... // 验证是否指向同一个Bean System.out.println((dao== dao1)); System.out.println((dao1== dao2)); // 输出bean的别名 String[] thisbean= factory.getAliases("thisbean"); for (String strbean: thisbean) { System.out.println(strbean); }
同时需要在struts.xml文件中配置该控制器,制定该控制器的处理路径以及跳转页面信息。
<action path="/channelV3" type="org.springframework.web.struts.DelegatingActionProxy" scope="request" parameter="method"> <forward name="toShowChannelAssign" path="/V2/frame/channel_assign.jsp" /> <forward name="toNOV2Cooperator" path="/V2/channel_no.jsp" /> <forward name="toShowGuide" path="/V2/guide_page_home.jsp?step=1" /> <forward name="toShowIndex" path="/indexV3.do?method=showIndex" redirect="true"/> <forward name="toShowDashBoard" path="/dashBoard.do?method=showDashBoard" redirect="true"/> <forward name="toNOChannel" path="/V2/channel_none.jsp" /> </action>
(由class跳转到Action操作)spring由注解功能(注解就是可以直接引用,不许要new出来),注解的方式由两种:
1.用set方法:
public class ChannelAction extends DispatchAction {private CoopCoreService coopCoreService ;public void setCoopCoreService(CoopCoreService coopCoreService) {this.coopCoreService = coopCoreService;}
2.用@方法:
@Repositorypublic class TcoopRuleDAO extends BaseDao {对于要被注解调用的类要先用@repository标注,才能用@resource注解调用。
@Servicepublic class TcoopRuleServiceImpl implements TcoopRuleITFService {protected Logger logger = Logger.getLogger("TcoopRuleLogServiceImpl");@Resourceprivate TcoopRuleDAO tcoopRuleDAO;@Resourceprivate GlobalUserDAO globalUserDao;@Resourceprivate TcoopServiceDAO tcoopServiceDAO;
@Service、@Resource,可以在类中直接调用方法,不需要再new出来。
struts会进行一些由action操作中的一些返回关键字到jsp界面的跳转。
<forward name="toShowIndex" path="/V2/index.jsp"></forward> <forward name="toShowAccount" path="/V2/account_detail.jsp"></forward>
二、着手创建一个项目(此处参考ssh设计)
1、关于搭建3框架问题,MyEclipse版本用5.5或6.0.1版本的容易成功,具体原因是包冲突。注意搭建时3框架加入的次序。一种是自底向上,顺序为hibernate->spring->struts。一种是自顶向下,顺序是Struts->Spring->Hibernate。当然熟练到一定程度,可以不按这两种方式了。选择Spring框架和Hibernate框架时注意选择copy library选项,具体原因是包冲突时,删除相对容易些。
2、选择Spring框架时加入AOP Libraries,Core Libraries,Persistence Core Libraries,以及Web Libraries类包就行了;选择Hibernate框架时,加入Hibernate __Core Libraries-<MyEclipse-Library>类包就可以了。如果报错的话一般是缺少类包,只要在网上下载最新版本的类包既可以了。3、整合SS时Spring的加载有两种方式:一种是在Struts-config.xml中实现,在</struts-config>之前加入<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /></plug-in>注意将<action中的type属性改为type="org.springframework.web.struts.DelegatingActionProxy";另一种方式:在web.xml中实现,加载如下,</context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext.xml </param-value> </context-param><!--通过servlet加载--> <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> </servlet> <!--通过listener加载,两种方法选一即可以<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class></listener>-->同样注意将Struts-config.xml的“<action”中的type属性改为type="org.springframework.web.struts.DelegatingActionProxy"。方式二可以加入多个Spring配置文件,本文中applicationContext.xml文件路径"/WEB-INF/applicationContext.xml"4、用Hibenate生成逆向工程时,使<generator class="increment" />,可以减少好多不必要麻烦5、Spring整合Hibernate要用到事务提交机制,否则的话数据不能保存到数据库中,之所以MySQL可以保存,是因为MySQL本身的bug问题。具体操作如下:在applicationContext.xml中,加入下列代码,<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="UsersDAOProxy"<!--此处bean id可以自己取--> class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 注意这个属性, 详细意义请参考文章开头的参考资料, 必须为 true 使用CGLIB才不用强制编写DAO接口 --> <property name="proxyTargetClass"> <value>true</value> </property> <property name="transactionManager"> <ref bean="transactionManager" /><!--注意保持一致--> </property> <property name="target"> <ref local="UsersDAO" /><!--注意此处local指的是本文件中可以操作entity的DAO,或自己写,或Hibernate自动生成--> </property> <property name="transactionAttributes"> <props> <!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 --> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>此处还要注意的一件事是,以前有DAO做的配置,全部要改成有DAO代理来配置。6、整合完毕后,一般报asm的错误,原因是Referenced Libraries中,asm.jar和asm-2.2.3.jar冲突,删掉asm-2.2.3.jar即可。7、log4j.properties文件,在工程名上点击右键new一个file命名为log4j.properties,确定后。打开在里边写入:# Configure logging for testing: optionally with log filelog4j.rootLogger=WARN, stdout# log4j.rootLogger=WARN, stdout, logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%nlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/spring.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n后保存,重新发布工程,重启Tomcat,可以在console中看到出错信息,用于查找错误8、在spring中如何配置的log4j?在web.xml中加入以下代码即可。<context-param><param-name>log4jConfigLocation</param-name><param-value>/WEB-INF/log4j.properties</param-value></context-param>
- 学习日记(四)针对ssh的理解
- 嵌入式学习日记(四)
- python学习日记(四)
- 学习日记(二)Hibernate用法:针对数据库表数据的增加,查询,更新,删除
- SSH学习日记之Struts(一)
- SSH学习日记
- Unity3D 学习日记(四)生成不重复的随机数
- 学习日记(五)getHibernateTemplate()与getSession()的理解
- Java学习日记_____对注解的理解(一)
- 谈谈我学习python2.7.12的浅陋理解(日记)
- 针对java实验的思考(四)
- 《学习日记》---javascript的原型链理解
- 针对GCD的理解
- 针对mybatis的理解
- 针对springMVC的理解
- FLEX学习日记(四) DataGrid
- 黑马程序员 学习日记(四)
- 黑马程序员--学习日记 (四)集合
- 国外基础几何算法答与问
- MFC多文档模板手动创建框架的一个问题
- OpenGL中屏幕坐标转为OpenGL坐标
- RGB和RGBQUAD的区别
- OpenGL中使用glew库进行GLSL编程遇到的一个问题
- 学习日记(四)针对ssh的理解
- 计算机辅助设计CAD/CAM开源软件
- 郑厂长系列故事——N骑士问题
- delphi根据进程PID获取程序所在路径的函数
- JS 动态创建表格
- SQLSERVER 自增列
- 多校第七场
- c++ 找出序列中出现得最频繁的值
- linux likely and unlikely解析