SSH项目的实现步骤

来源:互联网 发布:js动态生成树形菜单 编辑:程序博客网 时间:2024/05/21 08:02

1步、导入页面

         将表态页面资料复制到项目的“WebRoot”文件夹下。注:确保每个页面的字符符合JSP的编码方式(GBKUTF-8

 

2步、导入数据库驱动

将“mysql-connector-java-5[1].1.12-bin.jar”复制到项目的“WebRoot/WEB-INF/lib”文件夹下,刷新项目后出现

 

3步、添加Struts框架

         1、添加Struts:在项目名字上点右键选择如下图

        

         2、在“Base package for new classes”里填上“web”,点击Finish

        

         3、在web.xml文件里:

                   <1>删除下面的配置

<init-param>

      <param-name>config</param-name>

      <param-value>/WEB-INF/struts-config.xml</param-value>

    </init-param>

    <init-param>

      <param-name>debug</param-name>

      <param-value>3</param-value>

    </init-param>

    <init-param>

      <param-name>detail</param-name>

      <param-value>3</param-value>

    </init-param>

                           

                            <welcome-file-list>

  <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

                   <2>加上字符过滤器:

                            <filter>

              <filter-name>filter</filter-name>

              <filter-class>filter.CharFilter</filter-class>

              <init-param>

                <param-name>charSet</param-name>

                <param-value>gbk</param-value>

              </init-param>

           </filter>

           <filter-mapping>

              <filter-name>filter</filter-name>

              <url-pattern>/*</url-pattern>

           </filter-mapping>

         4、在 上点右键,新键一个filter包,然后下这个包下编写一个为CharFilter.java的文件,文件代码如下:

package filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

 

public class CharFilter implements Filter {

    private String charSet=null;

    public void destroy() {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

       request.setCharacterEncoding(charSet);

       response.setCharacterEncoding(charSet);

       chain.doFilter(request, response);//向后传递控制权 

    }

    public void init(FilterConfig config) throws ServletException {

       charSet=config.getInitParameter("charSet");

      

    }

}

    5、建立entity包,并根据Hibernate框架来生成实体类(User[详细请参考第五步、添加Hibernate的框架]

第四步、在Struts框架下完成一个登录操作

    1、在页面上:

<c:if test="${sessionScope.UserLoginInfo!=null}">

<div style="height:137px;background:url(images/myepai.gif) no-repeat;">

<strong>${UserLoginInfo.user_name}</strong> 大驾光临

<ul style="color:#0c0c0c;list-style-type:circle;margin:8px 16px;">

<li><a href="goods.do?operate=toAdd">发布商品</a></li>

<li>我的宝贝</li>

</ul>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<a href="userLogOut.do?operate=doLogOut" class="a_button">注销</a>

</div>

</c:if>

<c:if test="${sessionScope.UserLoginInfo==null}">

<form action="userLogin.do?operate=doLogin" method="post">

用户名:<input type="text" name="user.user_name" style="width:60px;" /> <br />

&nbsp;&nbsp;码:<input type="password" name="user.user_password" style="width:60px;" /><br />

<a href="user_agreement.jsp" class="a_button">用户注册</a>&nbsp;

<input type="submit" value="登录" class="button" style="width:40px;"/> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<img src="images/login.gif" style="width:75px;"></img>

</form>   

</c:if>

 

         2struts-config.xml文件里:

<form-beans>

    <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">

      <form-property name="user" type="entity.User"></form-property>

    </form-bean>

  </form-beans>

1form-bean标签里的type的值固定成:
org.apache.struts.action.DynaActionForm

         2form-property标签里的name的值为属性值,在页面上提交表单里的name应写为:属性值.实体的字段值。例如user.user_name

<action-mappings>

    <action path="/userLogin"

        name="loginForm"

        type="web.EpaiDispatchAction" parameter="operate"

        scope="request">

        <exception key="error.login" type="biz.exception.LoginException" path="/index.jsp"></exception>

        <forward name="success" path="/index.jsp"></forward>

        </action>

  </action-mappings>

1action 标签里的path的值与form表单提交时.do前面的单词保持一致。

2action标签里的name的值与form-bean标签里的name的值保持一致。

3action标签里的type的值与web包里所写的DispatchAction的名字保持一致。

4action标签里的parameter的值与form表单提交时.do?后面的单词保持一致。

5exception标签里的key的值与web包里的ApplicationResources.properties文件里面的 一致。

6exception标签里的type的值与biz包下面的exception包里的LoginException.java文件名一致。

7excetion标签里的path的值是报错后转向的路径,必须有“/”这个符号。

8forward标签里的name的值是与web包里的DispatchAction文件里所调用的方法doLogin里面的return mapping.findForward("success"); 里的success这个单词保持一致。

9forward标签里的path的值是正确执行后转向的路径,必须有“/”这个符号。

 

3DispatchAction.java文件(这里文件名为:EpaiDispatchAction.java)里:

package web;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.DynaActionForm;

import org.apache.struts.actions.DispatchAction;

import biz.UserLoginBiz;

import entity.User;

 

public class EpaiDispatchAction extends DispatchAction {

    private Biz biz;

    // 用户登录控制器方案

    public ActionForward doLogin(ActionMapping mapping, ActionForm form,

           HttpServletRequest request, HttpServletResponse response)

           throws Exception {

       DynaActionForm df = (DynaActionForm) form;

       User user = (User) df.get("user");

       User userInfo = biz.doLogin(user);

       request.getSession().setAttribute("UserLoginInfo", userInfo);

       return mapping.findForward("success");

    }

}

 

注:df.get(“user”)里面的userform-property标签里的name的值为属性值,要一致。

 

4、在biz包里建一个Biz.java,其内容如下:

package biz;

import java.util.List;

import biz.exception.LoginException;

import dao.BaseDao;

import entity.User;

public class Biz {

    private BaseDao dao;

    public User doLogin(User user) throws Exception {

       List list=(List)dao.findByParams("from User u where u.user_name=? and u.user_password=?", user.getUser_name(),user.getUser_password());

       if(list.isEmpty())

           throw new LoginException();

       return (User) list.get(0);

    }

}

5、在biz.exception包里建一个LoginException.java,其内容如下:

package biz.exception;

public class LoginException extends Exception {}

6、在web包里的ApplicationResources.properties文件里写上:

 

第五步、添加Hibernate框架

1、加入Hibernate

2、只选择Hibernate3.2 Core Libraries - <MyEclipse-Library>

3、点击Next后:

4、点击Next后去掉Specify database connection details?前的勾,再点击Next

5、去掉Create SessionFactory?前的勾,由Spring的容器来使用SessionFactory

6、在MyEclipse右上角点击

7、在MyEclipse左上角点击MyEclipse Derby选择New

8Driver template为要用的数据库类型;Driver name为在MyEclipse里的名称;<hostname>为主机名:一般为localhost<dbname>为数据库名;User name为数据库链接帐号;Password为数据库链接密码;

9、加入Driver JARS (数据库驱动JAR包):点击Add JARs按钮:

10、找到数据库JAR包点打开后,再点击Finish.

11、双击新建的DB

12、输入数据库登入密码(如果保存了密码就没有这一步):

13、打开新建的DB里面的数据库,找到要建立的实体所对应的表(也可选择多张表):

14Java src falder为项目里的src的路径;Java package为实体对象的包名;点击Finish

15、提示是否进入JAVA视图,点击Yes

16、打开hibernat.cfg.xmlDBDriver里选择新建的DB Driver

17、点击Properties里的Add..按钮

18Property选择:format_sqlValue值为:true

19Property选择:show_sqlValue值为:true

         注:Hibernate框架成功建立应该有以下三方面:

a.构建路径上有hibernatejar.

b.src下有hibernate.cfg.xml文件.

c.entity下有实体类,并且在同一目录下有"实体类名.hbm.xml".

20、双击所建实体(User.javaUser.hbm.xml)修改对应表的字段的属性,使其保持一致,也可以删除“Customers.hbm.xml”后自己新建xml文件,2125点的步骤为新建和编写xml文件

         21、指向 点击右键

选择后,在File name里填写“实体类名.hbm.xml

         22、点击Next>后,选择Create XML file from a DTD file,点击Next>

        

         23、选择Select XML Catalog entry,并找到Hibarnate Mapping DTD 3.0/EN,后击Next>

         24、点击Finish

         25、在dao包里建立BaseDao文件来链接数据库,文件代码如下:

package dao;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.Transaction;

public class BaseDao {

       //增加

       public void save(Object o){

           Session s=HibernateSessionFactory.getSession();

           Transaction tx=s.beginTransaction();

           s.save(o);

           tx.commit();

           HibernateSessionFactory.closeSession();

       }  

       //删除

       public void delete(Object o){

           Session s=HibernateSessionFactory.getSession();

           Transaction tx=s.beginTransaction();

           s.delete(o);

           tx.commit();

           HibernateSessionFactory.closeSession();

       }     

       //修改

       public void update(Object o){

           Session s=HibernateSessionFactory.getSession();

           Transaction tx=s.beginTransaction();

           s.update(o);

           tx.commit();

           HibernateSessionFactory.closeSession();

       }     

       //通过ID查找

       public Object findById(Class clazz,Long id){

           Session s=HibernateSessionFactory.getSession();

           Transaction tx=s.beginTransaction();

           Object o=s.get(clazz, id);

           tx.commit();

           HibernateSessionFactory.closeSession();

           return o;

       }  

       //通用查找

       public List findByParams(String hql,Object...params){

           Session s=HibernateSessionFactory.getSession();

           Transaction tx=s.beginTransaction();

           Query q=s.createQuery(hql);

           if(params!=null){

              int i=0;

              for(Object p:params){

                  q.setParameter(i, p);

                  i++;

              }

           }

           List list=q.list();

           tx.commit();

           HibernateSessionFactory.closeSession();

           return list;

       }

       //通用查找一条记录

       public Object findByParams2(String hql, Object... params){

           List list=this.findByParams(hql, params);

           if(!list.isEmpty()){

              return list.get(0);

           }

           return null;

       }  

       //分页查找

       public List findByParamsWithPage(int page,int pageSize,String hql,Object...params){

           Session s=HibernateSessionFactory.getSession();

           Transaction tx=s.beginTransaction();

           Query q=s.createQuery(hql);

           if(params!=null){

              int i=0;

              for(Object p:params){

                  q.setParameter(i, p);

                  i++;

              }

           }

           List list=q.setFirstResult((page-1)*pageSize).setMaxResults(pageSize).list();

           tx.commit();

           HibernateSessionFactory.closeSession();

           return list;

       }

}

         注:操作数据的原则

1.hibernate有自己的管理对象的阶段(生命周期)

2.对于new创建的数据只做save

3.先查询才能做改或删.

4.做查询时要先closereturn

5.不要对主键属性赋值.

面试:临时态和游离态对象有可能被垃圾回收,而持久态永不会回收.

         26、打开Bid.hbm.xml编写配置文件如下:

<class name="entity.Bid" table="bid" catalog="epai">

        <id name="bidId" type="java.lang.Long">

            <column name="bid_id" />

            <generator class="native" />

        </id>

        <many-to-one name="goods" class="entity.Goods" column="goods_id" cascade="save-update"/>

        <many-to-one name="user" class="entity.User" column="buyer_id" cascade="save-update"/>

        <property name="bidTime" type="java.sql.Timestamp">

            <column name="bid_time" length="19" not-null="true" />

        </property>

        <property name="bidPrice" type="java.lang.Float">

            <column name="bid_price" precision="12" scale="0" not-null="true" />

        </property>

        <property name="bidStatus" type="java.lang.Integer">

            <column name="bid_status" not-null="true" />

        </property>

</class>

说明:

a.类表映射

<class name="类名" table="表名" catalog="数据库名">

b.主键映射

<id name="对应主键的属性名" column="主键列名" type="类型名">

         <generator class="native"/>

</id>

若属性名与列名一致,可省略column

c.属性/字段映射

<property name="属性名" column="列名" type="类型名"/>

注意:

数据库类型     java类型(实体类属性类型)   hibernate配置中的类型

varchar                       java.lang.String                 java.lang.String

bigint                           java.lang.Long                   java.lang.Long

int                                java.lang.Integer              java.lang.Integer

bit                                java.lang.Boolean             java.lang.Boolean

blob                             java.lang.byte[]                 binary

date                            java.sql.Date                     java.sql.Date

timestamp                 java.sql.Timestamp          java.sql.Timestamp

char(1)                        java.lang.Character                  java.lang.Character

 

 

 

第六步       添加Spring容器

         1、加入Spring

         2、选择Spring1.2,勾上“AOP Libraries”“Core Libraries”“Persistence Core Libraries”和“web Libraries”,并选择“Copychecked Library contents to project folder”,点击Next

 

 

 

         3、点击Next

         4、点击Finish

 

第七步       StrutsSpring整合

         1、在web包里的EpaiDispatchAction.java里将biz加上set方法:

    private Biz biz;

    public void setBiz(Biz biz) {

       this.biz = biz;

    }

         2、在biz包里的Biz.java里将dao加上set方法:

    private BaseDao dao;

    public void setDao(BaseDao dao) {

       this.dao = dao;

    }

3中修改struts的配置文件struts-config.xml,将:

<action-mappings>

    <action path="/userLogin"

        name="loginForm"

        type="web.EpaiDispatchAction" parameter="operate"

        scope="request">

        <exception key="error.login" type="biz.exception.LoginException" path="/index.jsp"></exception>

        <forward name="success" path="/index.jsp"></forward>

        </action>

</action-mappings>

里面的type的值修改为:

org.springframework.web.struts.DelegatingActionProxy

         4、在struts-config.xml文件的最后加入:

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

    <set-property property="contextConfigLocation" value="classpath:applicationContext.xml"/>

</plug-in>

2、在applicationContext.xml里配置:

    <!-- 连接Action(客户) -->

    <bean name="/doLogin" class="web.EpetDispatchAction">

       <property name="biz" ref="petBiz"></property>

    </bean>

    <!-- 连接Biz(目标) -->

    <bean id="petBiz" class="biz.Biz">

       <property name="dao" ref="petDao"></property>

    </bean>

    <!-- (增强) -->

    <bean id="JiaFengAdvice" class="biz.JiaFengAdvice"></bean>

    <!-- (代理) -->

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

       <property name="beanNames">

           <list>

              <value>petBiz</value>

           </list>

       </property>

       <property name="interceptorNames">

           <list>

              <value>JiaFengAdvice</value>

           </list>

       </property>

    </bean>

    <!-- 连接Dao -->

    <bean id="petDao" class="dao.BaseDao">

       <property name="sessionFactory" ref="sessionFactory"></property>

    </bean>

         注:web.EpetDispatchAction里必项有bizset方法,biz.Biz里必须有daoset方法,ActionBizDaorefid要层层相扣。

 

第八步       aop的应用(用来在不修改源码的情况下增加新功能,建立SSH时,可以跳过)

aop的相关名词()

advice:表示一个增强的功能.

pointCut:表示一次或多次方法调用.

advisoradvice+pointcut

interceptor=adviceadvisor

         1、创建一个Advice对象,覆写方法完成增加的功能。

package biz;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class JiaJiFenAdvice implements MethodInterceptor {

    @Override//覆写方法完成增加的功能

    public Object invoke(MethodInvocation invocation) throws Throwable {

       Object res=null;

       try {

           //这里添加:在原有功能前加功能

           res=invocation.proceed();

           //这里添加:在原有功能后加功能

       } catch (Exception e) {

       }

       return res;

    }

}

         2、在“applicationContext.xml”文件里配置:

<!-- 客户 -->

    <bean name="/doLogin" class="web.EpetDispatchAction">

       <property name="diaryBiz" ref="petDiaryBiz"></property>

       <property name="loginBiz" ref="petLoginBiz"></property>

    </bean>

    <!-- 目标 -->

    <bean id="petDiaryBiz" class="biz.DiaryBiz"></bean>

    <bean id="petLoginBiz" class="biz.LoginBiz"></bean>

    <!-- 增强 -->

    <bean id="petJiaJiFenAdvice" class="biz.JiaJiFenAdvice"></bean>

    <!-- 代理 -->

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

       <property name="beanNames">

           <list>

              <value>petDiaryBiz</value>

              <value>petLoginBiz</value>

           </list>

       </property>

       <property name="interceptorNames">

           <list>

              <value>petJiaJiFenAdvice</value>

           </list>

       </property>

    </bean>

 

第九步       HibernateSpring的整合

         1、数据源托管,sessionFactory不再由hibernate提供,而改为spring提供。在applicationContext.xml里配置里体现为:

    <bean id="sessionFactory"

       class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

       <property name="configLocation"

           value="classpath:hibernate.cfg.xml">

       </property>

    </bean>

    <!-- 连接Dao -->

    <bean id="petDao" class="dao.BaseDao">

       <property name="sessionFactory" ref="sessionFactory"></property>

    </bean>

         2、简化dao的编写(具体代码查看第五步的第25点)

a.所有的dao继承HibernateDaoSupport

b.CRUD方法全部通过hibernateTemplate来完成.

c.dao注入sessionFactory.

         3、给业务层增加事务服务

    <!-- 配置事务管理器 -->

    <bean id="tm"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

       <property name="sessionFactory" ref="sessionFactory"/>

    </bean>

    <!--aop的方式产生代理对象-->

    <bean id="baseTransactionProxy"

    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

       abstract="true">

       <property name="transactionManager" ref="tm" />

       <property name="transactionAttributes">

           <props>

              <prop key="login">PROPAGATION_REQUIRED</prop>

              <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

           </props>

       </property>

    </bean>

    <!-- petBiz业务连接 -->

    <bean id="petBizProxy" parent="baseTransactionProxy">

       <property name="target" ref="petBiz" />

    </bean>

 

原创粉丝点击