SSH框架搭建全过程详解

本项目使用Struts2+spring3+hibernate3;

第一步:引入jar包,具体需要哪些包根据实际情况加入。注意:把jar包导入后需要对所有包Add to Build Path;然后对工程名右键Build Path——>configure Build Path——>Add External JARS选择tomcat路径,添加"servlet-api.jar"  "el-api.jar"  "jsp-api.jar" 这三个jar包。

第二步:配置applicationContext.xml

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:component-scan base-package="ssh.demo.dao,ssh.demo.service,ssh.demo.action" />      

    <import resource="dao.xml"/>
    <import resource="service.xml"/>  

</beans>

我把配置根据作用对象不同分别写在两个配置文件中,再在applicationContext.xml文件中import.

1.dao.xml

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!--c3p0连接池参数设置说明  -->
    <!--maxPoolSize表示连接池中保留的最大连接数,default为15  -->
    <!--minPoolSize表示连接池中保留的最小连接数  -->
    <!--initialPoolSize表示初始化时获取的连接数,取值应该在maxPoolSize和minPoolSize之间,default为3  -->
    <!--maxIdleTime表示最大空闲时间,60秒内未使用则连接被丢弃,若为0则永不丢弃,default为0  -->
    <!--acquireIncrement当连接池用连接被耗尽的时候c3p0一次同时获取的连接数,default 3  -->
    <!--maxStatements,JDBC的标准参数,用于控制数据源内加载的PreparedStatements数量,但由于预缓存的statements属于单个connection而不是整个连接池。
         所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭,default 0 -->
    <!--idleConnectionTestPeriod表示每多少秒检查连接池中的空闲连接,default 0  -->
    <!--acquireRetryAttempts定义在数据库获取新连接失败后重新尝试的次数,default  -->
    <!--breakAfterAcquireFailure获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继
        续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false  -->
    <!--testConnectionOnCheckout因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用
        idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false   -->
<!--     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sshanno" />
        <property name="user" value="root" />
        <property name="password" value="root" />
        <property name="maxPoolSize" value="20" />
        <property name="minPoolSize" value="5" />
        <property name="maxStatements" value="50" />
        <property name="maxIdleTime" value="1800" />
    </bean> -->

    <!-- location值为参数配置文件的位置 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--dbcp连接池参数设置说明  -->
    <!--initialSize表示池启动时创建的连接数量  -->
    <!--maxActive表示同一时间可以从池分配的最多连接数量,设置为0时表示无限制  -->
    <!--maxIdle表示池里不会释放的最多的空闲的连接数量,设置为0时表示无限制  -->
    <!--minIdle表示在不新建连接条件下,池中保持空闲的最少连接数  -->
    <!--removeAbandoned设置自动回收超时连接,value为true或false  -->
    <!--removeAbandonedTimeout设置自动回收超时时间(以秒数为单位)  -->
    <!--logAbandoned设置在自动回收超时连接的时候打印连接的超时错误,value为true或false  -->
    <!--maxWait等待超时以毫秒为单位,在抛出异常前,池等待连接被回收的最长时间(当没有可用连接时),设置为-1表示无限等待  -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close"
        p:driverClassName="${driverClassName}"
        p:url="${url}"
        p:username="${username}"
        p:password="${password}"
        p:maxActive="${maxActive}"
        p:maxIdle="${maxIdle}"
        p:minIdle="${minIdle}"/>

    <!--在hibernate3中获取sessionFactory ,hibernate4则class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" -->
    <!--设置属性说明  -->
    <!--hibernate.dialect设置方言  -->
    <!--hibernate.format_sql输出格式化的sql  -->
    <!--hibernate.show_sql控制台输出sql  -->
    <!--hibernate.hbm2ddl.auto 自动创建|更新|验证数据库表结构。有以下几个参数:
        create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
        create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
        update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了
        但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
        validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 -->
    <!--current_session_context_class使用缓存机制。(hibernate3:Thread或jta);(hibernate4:org.springframework.orm.hibernate4.SpringSessionContext)  -->
    <!--hibernate.cache.provider_class 使用Ehcache缓存;hibernate3是org.hibernate.cache.HashtableCacheProvider;hibernate4是net.sf.ehcache.hibernate.EhCacheProvider  -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2005Dialect</prop> -->
                <!-- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> -->
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="current_session_context_class">Thread</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
            </props>
        </property>
        <!--自动扫描(实体类)注解包:实体类位置为:com.spring.mvc.entities.User,不能写成:com.spring.mvc.entities,而要写成:com.spring.mvc,packagesToScan要比实际上前一层-->
        <property name="packagesToScan" value="ssh.demo..*"/>

        <!-- 对于annotatedClasses只能一个类一个类的写,不能用*通配符 。可以用packagesToScan扫描包的方式代替annotatedClasses方式-->
        <!-- <property>
            <list>
                <value>ssh.demo.*</value>
            </list>
        </property> -->
        <!--上面的方法是错误的,下面的方法才是正确的。但是当类很多时,可以用packagesToScan扫描包的方式代替  -->
        <!-- <property name="annotatedClasses">
            <list>
                <value>ssh.demo.domain.User</value>
                <value>ssh.demo.domain.UserLog</value>
                <value>ssh.demo.domain.Product</value>
            </list>
        </property> -->
    </bean>

    <!--hibernate3.1以及以上版本取消了hibernateTemplate,hibernate4需要通过getCurrentSession()获取session  -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"
        p:sessionFactory-ref="sessionFactory" />

</beans>

上面设置数据源时使用了外部参数配置文件:jdbc.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/sshanno?useUnicode=true&characterEncoding=utf-8
username=root
password=root
maxActive=50
maxIdle=40
minIdle=10

#driverClassName=net.sourceforge.jtds.jdbc.Driver
#url=jdbc:jtds:sqlserver://localhost:1433;databaseName=ssh
#username=sa
#password=sa
#maxActive=50
#maxIdle=40
#minIdle=10

#driverClassName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#username=cd
#password=cd
#maxActive=50
#maxIdle=40
#minIdle=10

2.service.xml

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!--spring对hibernate的事务管理  -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactory">
    </bean>

    <aop:config>
        <aop:pointcut expression="execution(* ssh.demo.service..*(..))" id="serviceMethod"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--默认:
                isolation:DEFAULT
                propagation:REQUIRED
                timeout:-1 事物超时时间由底层事物系统决定
                read-only:false
                rollback-for:所有允许异常回滚
                no-rollback-for:所有检查异常不回滚 -->

            <tx:method name="get*" read-only="true"/>
            <tx:method name="do*"/>
        </tx:attributes>
    </tx:advice>

</beans>

第三步:配置struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- 自动扫描action包 -->
    <!-- 注解需要的jar包:struts2-convention-plugin -->
    <!-- <constant name="struts.convention.default.parent.package" value="default" /> -->
    <constant name="struts.convention.package.locators" value="action" />
     <constant name="struts.convention.classes.reload" value="true" />
     <!-- <constant name="struts.objectFactory" value="spring"/> -->
    <package name="default" namespace="/" extends="struts-default">
        <!-- <action name="product" class="ssh.demo.action.ProdutAction" method="getProducts">
            <result name="success">/product.jsp?preparedProducts=true</result>
        </action> -->
    </package>
</struts>

第四步:配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <display-name>ssh</display-name>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

     <context-param>
        <param-name>log4jConfigLocation</param-name>
        <!-- <param-value>/WEB-INF/classes/log4j.properties</param-value>  -->
        <param-value>classpath:log4j.properties</param-value>
    </context-param>
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>3000</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>  

  <context-param>
      <param-name>contextConfigLocation</param-name>
      <!-- <param-value>/WEB-INF/classes/applicationContext.xml</param-value> -->
      <param-value>classpath*:applicationContext.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

   <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>/*</url-pattern>
  </filter-mapping> 

    <!-- strut2 dispatcher -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
            <!--
            为了页面能用jsp:forward,否则struts2接管请求,跳不到action去。
         -->
        <dispatcher>REQUEST</dispatcher>
          <dispatcher>FORWARD</dispatcher>
          <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

    <!--为解决lazy=true在jsp页面上遍历数据,此时相关类(one2many)再查找,没有session的情况 -->
    <!--getCurrentSession()事务会自动关闭,所以在所有jsp页面查询数据都会关闭session。要想在jsp查询数据库需要加入下面这个  -->
    <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
             org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
    <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

</web-app>

第五步:新建实体类

package ssh.demo.domain;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.BatchSize;

/**
 * 用户表
 *
 * 一般不要使用catalog属性,
 * catalog是对应数据库名称,比如:在MySQL中数据库名称是ssh
 * 但在MSSQL中,不使用catalog,使用的是schema
 * MSSQL默认的schema是dbo
 * @author fox
 *
 */
@Entity
@Table(name="tbl_user")
public class User implements Serializable {

    private static final long serialVersionUID = -8992313421496945642L;

    /**
     * Oracle 下查看序列命令:select * from user_sequences
     */
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="user_id")
    private Long id;

    @Column(name="user_loginname", unique=true, nullable=false)
    private String loginName;

    @Column(name="user_loginpassword", nullable=false)
    private String loginPassword;

    @OneToMany(mappedBy="user", fetch=FetchType.LAZY)
    @BatchSize(size=10)
    private Set<UserLog> userLogs = new HashSet<UserLog>();

    public Set<UserLog> getUserLogs() {
        return userLogs;
    }
    public void setUserLogs(Set<UserLog> userLogs) {
        this.userLogs = userLogs;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getLoginName() {
        return loginName;
    }
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }
    public String getLoginPassword() {
        return loginPassword;
    }
    public void setLoginPassword(String loginPassword) {
        this.loginPassword = loginPassword;
    }
}
package ssh.demo.domain;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
 * 用户登录情况表
 *
 * @author fox
 *
 */
@Entity
@Table(name="tbl_userlog")
public class UserLog implements Serializable {

    private static final long serialVersionUID = -6520978050619047269L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="userlog_id")
    private Long id;

    @Column(name="userlog_date", nullable=false)
    private Date date;

    @Column(name="userlog_type")
    private String type;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

tbl_user表和tbl_userlog表是一对多的关系。

第六步:controller层

package ssh.demo.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.springframework.web.context.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport implements ServletContextAware,
    ServletRequestAware, ServletResponseAware {

    private static final long serialVersionUID = -2778286744226080905L;

    protected HttpServletRequest request;
    protected HttpServletResponse response;
    protected HttpSession session;
    protected ServletContext application;

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
        this.session = this.request.getSession();

    }

    @Override
    public void setServletContext(ServletContext application) {
        this.application = application;
    }

}
package ssh.demo.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import ssh.demo.domain.User;
import ssh.demo.service.UserService;

import com.opensymphony.xwork2.ModelDriven;

/**
 * 使用注解的方式配置,struts2的action不再是单例,不需要加@scope("prototype")
 * 而此时,service和dao默认还是单例
 * @author fox
 *
 */
@Controller
@Results({
    @Result(name = "input", location = "/login.jsp", type="redirect" , params={"error", "1"}),
    @Result(name = "success", location = "/index.jsp", type="redirect")})

public class LoginAction extends BaseAction implements ModelDriven<User> {

    private static final long serialVersionUID = -6335887400814653355L;

    public LoginAction(){
        System.out.println("---LoginAction 构造函数---");
    }

    @Autowired
    private UserService userService;

    private User user = new User();

    public User getModel() {
        return this.user;
    }

    @Action("/doLogin")
    public String doLogin() throws Exception {

        System.out.println("--Hello--");
        System.out.println(this.user.getLoginName());
        System.out.println(this.user.getLoginPassword());
        System.out.println(this.request.getParameter("loginName"));
        System.out.println(this.request.getParameter("loginPassword"));

        System.out.println(this.userService);
        User u = this.userService.getUserLogin(this.user.getLoginName(), this.user.getLoginPassword());
        if(u == null) {
            System.out.println("--登录失败---");
            return INPUT;
        } else {
            System.out.println("--登录成功---");
            this.userService.doSaveUserLog(u);
            return SUCCESS;
        }
    }
}

第七步:service层

package ssh.demo.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import ssh.demo.dao.UserDao;
import ssh.demo.dao.UserLogDao;
import ssh.demo.domain.User;
import ssh.demo.domain.UserLog;

@Service("userService")
public class UserServiceImpl implements UserService{
    public UserServiceImpl(){
        System.out.println("---UserService 构造函数---");
    }

    @Autowired
    private UserDao userDao;

    @Autowired
    private UserLogDao userLogDao;

    @Override
    public User getUserLogin(String loginName, String loginPassword) {

        return this.userDao.getUser(loginName, loginPassword);
    }
}

第八步:dao层

package ssh.demo.dao;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.stereotype.Repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;

import ssh.demo.domain.User;

@Repository("userDao")
public class UserDaoImpl extends BaseDao implements UserDao{

    public UserDaoImpl(){
        System.out.println("---UserDao 构造函数---");
    }

    @Autowired
    protected HibernateTemplate hibernateTemplate;

    @Override
    public User getUser(final String name, final String password) {
        System.out.println(this.hibernateTemplate);
        return (User)this.hibernateTemplate.execute(new HibernateCallback<Object>() {
            @Override
            public Object doInHibernate(Session session) throws HibernateException,
                    SQLException {
                return session
                        .createQuery("from User u where u.loginName=:name and u.loginPassword=:password")
                        .setString("name", name)
                        .setString("password", password)
                        .uniqueResult();
            }
        });
    }

    @Override
    public void saveUser(User user) {
        this.hibernateTemplate.save(user);
    }

    @Override
    public List<User> getUsers() {
        return this.hibernateTemplate.loadAll(User.class);
    }

}

最后补充:为了方便在控制台看见后台操作的结果,能够输出后台执行情况,再加一个文件log4j.properties

 1 ##OFF->FATAL->ERROR->WARN->INFO->DEBUG->ALL
 2 ##ERROR->WARN->INFO->DEBUG
 3 # define a logger named CONSOLE
 4 log4j.rootLogger=INFO, CONSOLE
 5 # CONSOLE logger - console
 6 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
 7 # COSOLE Layout
 8 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
 9 # CONSOLE format Layout
10 log4j.appender.CONSOLE.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss,SSS} %c:(%F:%L) - %m%n 

到这里,再写好相应的jsp页面就可以运行一个springmvc的网站了。

时间: 2024-11-15 05:31:04

SSH框架搭建全过程详解的相关文章

SSH框架搭建过程详解

Spring.Struts2.Hibernate框架: 具体三大框架的知识以前的文章写过,在这里整合 Spring框架知识:http://www.cnblogs.com/xuyiqing/category/1164340.html Struts2框架知识:http://www.cnblogs.com/xuyiqing/category/1164341.html Hibernate框架知识:http://www.cnblogs.com/xuyiqing/category/1163473.html

Spring MVC 框架搭建及详解

一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.commons-logging.jar.cglib-nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar.hibernate-jpa-2.0-api-1.0.1.Final.jar.antlr-2.7.6.jar.commons-collections-3

SSH框架--struts深入详解(一)

学习了struts,但是对于它的由来,以及为什么使用action和struts.xml的方式而不采用以前的servlet方式,有些疑问,到底之前的方式有什么弊端,struts又给我们带来了什么便利? 下面一一为大家解答! struts的由来: 随着JSP与Servlet 技术大量应用于以Web为基础的应用程序,为了提升Web 应用程序可维护性与重复使用性,Java开发人员提出了一些较佳的开发模式.比较常见的两种JSP应用架构分别为Model1 与Model 2.详情参见(JAVA学习篇--JAV

SSH框架的整合详解

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> SSH框架的整合详解 - super_YC的博客 - 博客频道 - CSDN.NET super_YC的博客 记录我生活的一点一滴!我很开心拥有这样一个自己心事的笔记本 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的P

ssh框架构建项目详解--基本概念和struts2

1.ssh是struts+spring+hibernate的继承框架,是目前比较流行的框架,但是已经不如ssm了. 2.集成ssh从职责上分为四层(类似于servlet+jsp+jdbc做项目的三层构架:视图,控制,业务....),分别是表示层,业务逻辑层,数据持久层,域模块层,这样分层可以让程序员短时间内构建一个结构清晰,复用性高,维护方便的web应用程序 a.使用struts作为系统的整体基础架构,负责mvc的分离(模型,视图,控制器), b.在struts框架的模型部分,控制业务反转! c

Struts2.0 框架搭建步骤详解

实现了MVC思想的struts框架,主要分三层结构,即:view->controller->model,三者互相传递数据,实现了数据在前台和后台的转换,验证,展示,存储. 搭建struts框架的步骤如下: 1.在myeclipse中新建Java项目,删除项目中的源文件src,建立普通文件,将Struts解压后的jar包复制在新建的普通文件夹中. 2.新建web项目,右键选择build path->add jars(不是导入外部第三方的jar包) 选择第一步新建的Java项目,将里面的Ja

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单机的搭建,是因为作为个人学习的话,单机已足以,好吧,说实话是自己的电脑不行,使用虚拟机实在太卡了... 整个的集群搭建是在公司的测试服务搭建的,在搭建的时候遇到各种各样的坑,当然也收获颇多.在成功搭建大数据集群之后,零零散散的做了写笔记,然后重新将这些笔记整理了下来.于是就有了本篇博文. 其实我在搭

eclipse中SSH框架搭建和项目开发基本步骤

1.下载SSH框架代码和eclipse插件,地址:http://yunpan.cn/QTCrdHF4xkEVp (提取码:0e8d) 注意,一定要分清楚,SSH框架是要导入到自己的工程项目中的包,这些包是要在项目中调用的预先开发好的java文件:而eclipse插件是在eclipse环境下开发SSH相关项目是方便用户建立项目管理项目的工具,跟项目本身的文件和功能无关.一定要分清楚这两个概念. 2,下载完成之后,解压,会发现有5个文件夹,第一步要用到的是spring plugins for ecl

spring框架 AOP核心详解

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知 (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around