Sping(6)SSH开发

来源:互联网 发布:虚拟机装mac蓝屏 编辑:程序博客网 时间:2024/05/17 07:43

1.SSH开发完整配置流程

  1. 引入sprng开发包(http://pan.baidu.com/s/1bpgq28f)
  2. 编写ApplicationContext.xml文件(或者beans.xml)凡在src目录下
    需要的dtd头:
    <?xml version="1.0" encoding="utf-8"?><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"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"></beans>
  3. 加入Hibernate开发包(http://pan.baidu.com/s/1nvx7cQt)

  4. 因为是ssh,所以Hibernate的核心,就被spring接管了(hibernate.cfg.xml文件、*.hbm.xml文件、SessionFactory在spring的文件中配置即可)

  5. 在ApplicationContext.xml文件中配置数据源

    <!-- 配置数据源

    数据源:连接池 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/><property name="username" value="scott"/><property name="password" value="tiger"/><!-- 连接池启动时的初始值 --><property name="initialSize" value="3"/><!-- 连接池最大值 --><property name="maxActive" value="500"/><!-- 最大空闲值,当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接释放一部分, 一直减少到最大空闲值 --><property name="maxIdle" value="2"/><!-- 最小空闲值,当空闲的连接数少于阈值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --><property name="minIdle" value="1"/></bean>

  6. 配置SessionFactory对象

    <!-- 配置会话工厂 --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><!-- 设置数据源 --><property name="dataSource" ref="dataSource"/><!-- 接管了Hibernate的对象映射文件 --><property name="mappingResources"><list><value>com/test/domain/Employee.hbm.xml</value></list></property><property name="hibernateProperties"><value>hibernate.dialect=org.hibernate.dialect.OracleDialecthibernate.hbm2ddl.auto=updatehibernate.show_sql=falsehibernate.format_sql=true</value></property></bean>

  7. 编写domain对象Employee.java和对象映射文件Employee.hbm.xml

    public class Employee {private Integer id;private String name;private String email;private Date hiredate;private Float salary;}
    <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.test.domain">   <class name="Employee" table="employee"><!-- 主键策略 --><id name="id" type="java.lang.Integer"><generator class="native"/></id><property name="email" type="java.lang.String"><column name="email" length="64"></column></property><property name="hiredate" type="java.util.Date"><column name="hiredate"></column></property><property name="name" type="java.lang.String"><column name="name" length="64"></column></property><property name="salary" type="java.lang.Float"><column name="salary"></column></property>   </class></hibernate-mapping>

  8. 使用事务管理器统一管理事务
    添加Employee的service类和service接口

    // ---------EmployeeServiceInter接口类---------------public interface EmployeeServiceInter {public void addEmployee(Employee e);public void updEmployee(Employee e);public void delEmployee(java.io.Serializable id);public List<Employee> showEmployee();}// ---------EmployeeService实现类---------------/* 这里配置@Transactional,用处是让spring的事务管理器接管该service的事务 * 该注解可以加到class上;也可以加到method上(这种情况,只管理某一个方法)。 * */@Transactionalpublic class EmployeeService implements EmployeeServiceInter {private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}@Overridepublic void addEmployee(Employee e) {// Session s = sessionFactory.openSession();// Transaction ts = s.beginTransaction();// s.save(e);// ts.commit();// 配置事务管理器后才能这样简写sessionFactory.getCurrentSession().save(e);}@Overridepublic void updEmployee(Employee e) {// TODO Auto-generated method stub}@Overridepublic void delEmployee(Serializable id) {// TODO Auto-generated method stub}@Overridepublic List<Employee> showEmployee() {// TODO Auto-generated method stubreturn null;}}

  9. 使用事务管理器统一管理事务
    配置applicationContext.xml文件(省略了对service实现类的配置)

    <!-- 配置事务管理器,统一管理SessionFactory的事务 --><bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 启用事务注解 --><tx:annotation-driven transaction-manager="txManager"/>
  10. 配置Hibernate的二级缓存( 配置会话工厂 时的一个property中添加)
    添加二级缓存开发包;并将ehcache的配置文件放到src目录下

    <property name="hibernateProperties"><value>hibernate.dialect=org.hibernate.dialect.OracleDialecthibernate.hbm2ddl.auto=updatehibernate.show_sql=truehibernate.format_sql=true<!-- 配置二级缓存 -->hibernate.cache.use_second_level_cache=truehibernate.cache.provider_class=org.hibernate.cache.EhCacheProviderhibernate.generate_statistics=true</value></property>

  11. 引入Structs开发包(http://pan.baidu.com/s/1hsut1Yk)

  12. 创建structs-config.xml文件,放在/WEB-INF目录下
    需要的dtd头:

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config></struts-config>

  13. 配置structs-config.xml文件
    创建login.jsp和mainFrame.jsp文件

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'login.jsp' starting page</title>  </head>    <body>    <h1>管理员登录</h1>    <form action="/myssh/login.do?flag=login" method="post">    <table>    <tr><td>id:</td><td><input type="text" name="id"></td></tr>    <tr><td>pw:</td><td><input type="password" name="pwd"></td></tr>    <tr><td><input type="submit" value="登录"></td><td><input type="reset" value="重新填写"></td></tr>    </table>    </form>  </body></html><!-- ###################################################################### --><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'mainFrame.jsp' starting page</title>  </head>    <body>    <h2>请选择您的操作</h2><br>    <a href="">添加雇员</a><br>    <a href="">显示雇员</a><br>    <a href="">查询雇员</a><br>    <a href="">退出系统</a><br>      </body></html>
    创建EmployeeForm和LoginAction文件:
    public class EmployeeForm extends ActionForm {private String id;private String pwd;}// ---------------------------------------------------public class LoginAction extends DispatchAction {public ActionForward login(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {EmployeeForm employeeForm = (EmployeeForm) form;if(employeeForm.getPwd().equals("123")) {return mapping.findForward("ok");} else {return mapping.findForward("err");}}}
    配置structs-config.xml文件
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config><form-beans><form-bean name="employeeForm" type="com.test.web.forms.EmployeeForm"/></form-beans><action-mappings><action path="/login" parameter="flag" name="employeeForm" type="com.test.web.action.LoginAction"><forward name="ok" path="/WEB-INF/mainFrame.jsp"/><forward name="err" path="/WEB-INF/login.jsp"/></action></action-mappings></struts-config>

  14. 在web容器web.xml中配置spring
    当我们的tomcat在启动的时候,就会实例化spring容器(ApplicationContext.xml文件)

    <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径(类路径从src目录开始)下查找 -->  <context-param>  <param-name>contextConfigLocation</param-name>  <param-value>classpath:applicationContext.xml</param-value>  </context-param>  <!-- 对spring容器进行实例化 -->  <listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>
    在需要的地方可以通过下面的方式取出spring容器(Action没有交给spring管理的情况下,要先获取spring容器,再获得serviceInter接口的bean)
    // 通过下面语句,可以直接获取spring容器实例,即前面提到的ApplicationContextWebApplicationContext wac= WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());// 从spring容器中获取beanEmployeeServiceInter esi = (EmployeeServiceInter) wac.getBean("employeeService");

  15. 让spring接管我们的struts(也就是Action控件)
    通过这种方式,可以通过接口达到层间解耦合的目的;同时,也可以解决action是单例的问题(prototype模式下)
    把action交给spring管理后,我们可以使用依赖注入,在action中注入业务层的bean。确保action的path属性值(structs-config.xml文件action-mappings下action元素的path)与bean的名称相同
    在structs-config.xml文件中的配置

    <!-- 配置代理请求处理 --><controller><set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/></controller>
    在ApplicationContext.xml文件中配置action路径
    <!-- 配置action --><bean name="/login" scope="prototype" class="com.test.web.action.LoginAction"><property name="employeeServiceInter" ref="employeeService"/></bean>
    与此同时,structs-config.xml文件中,下面的配置type可以去掉
    <action-mappings><action path="/login" parameter="flag" name="employeeForm" type="com.test.web.action.LoginAction"><forward name="ok" path="/WEB-INF/mainFrame.jsp"/><forward name="err" path="/WEB-INF/login.jsp"/></action></action-mappings><!-- 更改为 --><action-mappings><action path="/login" parameter="flag" name="employeeForm"><forward name="ok" path="/WEB-INF/mainFrame.jsp"/><forward name="err" path="/WEB-INF/login.jsp"/></action></action-mappings>
    对LoginAction进行相应改动:(此时,将LoginAction当作一个bean来处理,可以直接获取serviceInter接口的bean,进行验证工作)
    public class LoginAction extends DispatchAction {EmployeeServiceInter employeeServiceInter;public void setEmployeeServiceInter(EmployeeServiceInter employeeServiceInter) {this.employeeServiceInter = employeeServiceInter;}public ActionForward login(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {EmployeeForm employeeForm = (EmployeeForm) form;// 构建一个Employee对象Employee e = new Employee();e.setId(Integer.parseInt(employeeForm.getId()));e.setPwd(employeeForm.getPwd());System.out.println(employeeForm.getId() + " " + employeeForm.getPwd());e = employeeServiceInter.checkEmployee(e);if(e!=null) {// 把雇员信息放入sessionrequest.getSession().setAttribute("loginuser", e);return mapping.findForward("ok");} else {return mapping.findForward("err");}}}

  16. 解决中文乱码问题
    自己配置过滤器

    public class MyFilter extends HttpServlet implements Filter {@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO Auto-generated method stubarg0.setCharacterEncoding("utf-8");arg2.doFilter(arg0, arg1);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
    web.xml文件中配置:
    <!-- 配置自己写的过滤器 -->  <filter>  <filter-name>MyFilter</filter-name>  <filter-class>com.test.web.filter.MyFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>MyFilter</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>
    ②使用spring框架提供的处理中文乱码的过滤器(直接在web.xml文件中配置)
    <!-- spring提供的对中文乱码处理的过滤器 -->  <filter>  <filter-name>encoding</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>encoding</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>

  17. spring可以通过启用注解的方式来配置属性
    首先在ApplicationContext.xml文间中启用注解扫描:

    <!-- 启用注解扫描 --><context:annotation-config/>
    bean的配置方式可以这样:
    <!-- 配置EmployeeService对象 <bean id="employeeService" class="com.test.service.imp.EmployeeService"><property name="sessionFactory" ref="sessionFactory"/></bean>--><!-- 配置EmployeeService对象,通过注解的方式来注入属性值 --><bean id="employeeService" class="com.test.service.imp.EmployeeService"/>
    在EmployeeService的java类中对相应属性进行设置
    // 当我们给某个属性增加了@Resource后,spring就会启动byName的方式注入属性值sessionFactory@Resourceprivate SessionFactory sessionFactory;

  18. 解决懒加载问题(同样,有前面提到的三种方案)
    不管使用明确初始化的方式,还是配置对象映射文件的lazy=false方式,都会增加性能消耗。
    Spring专门提供了opensessioninview的方法来解决懒加载问题,只需要在web.xml文件中添加如下配置:

    <!-- 配置OpenSessionInView来解决懒加载 -->  <filter>  <filter-name>OpenSessionInViewFilter</filter-name>  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  <init-param>  <param-name>encoding</param-name>  <param-value>UTF-8</param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name>OpenSessionInViewFilter</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>




2 引入jQuery库(官网下载即可)

放在WebRoot下的js文件夹中
在jsp页面这样引入
<script type="text/javascript" language="javascript" src="/myssh/js/jquery-2.0.3.js"></script><script type="text/javascript" language="javascript" src="/myssh/js/my.js"></script>  -----这是适用我项目的js文件
$(document).ready(function() {window.alert("ok");});---这里(my.js)测试用,只有当dom准备好后,才会执行function内的代码 $(document).ready(function() {//window.alert("ok");// 和class为delid的控件$(".delid").click(function () {return window.confirm("你确定删除该雇员吗?");}); });

3 Hibernate启用默认值(建表时的默认值)

在*.hbm.xml文件中添加:dynamic-insert="true"

<hibernate-mapping>    <class name="com.xiaonei.domain.Users" table="users" dynamic-insert="true" catalog="xiaonei">        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="increment" />        </id>        <property name="locked" type="java.lang.Short">            <column name="locked" />        </property>    </class></hibernate-mapping>

4 解决中文乱码问题(包括以下几点)

4.1 保证MySQL数据库创建user表的编码(show create table users; 命令显示的最后一行)和程序中(applictionContext.xml中关于数据源dataSource的配置)去连接数据库的码表一样。
<property name="url" value="jdbc:mysql://localhost:3306/xiaonei?useUnicode=true&characterEncoding=utf-8"/>
4.2 在ssh框架,要配置过滤器,解决乱码(不进行这一项配置,进入数据库后,数据仍然是乱码)
****参考本博客上面第一部分内容****


























































0 0
原创粉丝点击