idea:ssh整合小例子:读取数据库信息显示到jsp上面

1.idea创建项目:很方便,在下面添加各自的jar包,注意点:hibernate和struts2都有一个javassiste的jar包,把低级的删掉即可,因为有两个的时候,会有转换异常

         

idea会帮你配置好基本的信息。


jar包一览:

 


2.首先,在大佬web.xml配置好加载各小弟的配置信息:idea帮忙生成的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         version="3.1">
 
 
    <!--读取spring配置-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml,classpath:applicationContext-beans.xml</param-value>
    </context-param>
 
 
    <!--struts2配置-->
    <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>
    </filter-mapping>
 
    <!--listener-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
</web-app>



3.把hibernate搞到spring的容器中去......(已经写过这一方面的内容,就不详细了,直接贴代码  )

applicationContext.xml这个文件是配置hibernate与spring的整合信息的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?xml version="1.0" encoding="UTF-8"?>
       xmlns:context="http://www.springframework.org/schema/context"
 
    <context:property-placeholder location="classpath:db.properties"/>
 
 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
 
        <property name="user" value="${user}"/>
        <property name="password" value="${password}"/>
        <property name="driverClass" value="${driveClass}"/>
        <property name="jdbcUrl" value="${url}"/>
 
    </bean>
 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
 
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingLocations" value="classpath:*.hbm.xml"/>
        <property name="hibernateProperties">
 
            <props>
 
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
            </props>
        </property>
 
    </bean>
 
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
 
    </bean>
 
    <aop:config>
 
        <aop:pointcut id="pointCut" expression="execution(* com.service.*.*(..))"/>
 
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
    </aop:config>
 
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
 
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
 
</beans>

db.properties

1
2
3
4
user=root
password=
driveClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=UTF-8



为完善上面这个配置文件,需要生产bean类和mapping映射文件:

Department.java

Employee.java

Department.hbm.xml

Employee.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.entities;
 
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
 
 
@Entity
public class Department {
    private int id;
    private String departmentname;
 
    @Id
    @Column(name = " ID", nullable = false)
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    @Basic
    @Column(name = "DEPARTMENTNAME", nullable = true, length = 255)
    public String getDepartmentname() {
        return departmentname;
    }
 
    public void setDepartmentname(String departmentname) {
        this.departmentname = departmentname;
    }
     
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.entities;
 
import javax.persistence.*;
import java.util.Date;
 
 
@Entity
public class Employee {
    private int id;
    private String lastname;
    private String email;
    private Date birth;
    private Date createtime;
    private Department department;
 
    @Id
    @Column(name = "ID", nullable = false)
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    @Basic
    @Column(name = "LASTNAME", nullable = true, length = 255)
    public String getLastname() {
        return lastname;
    }
 
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
 
    @Basic
    @Column(name = "EMAIL", nullable = true, length = 255)
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    @Basic
    @Column(name = "BIRTH", nullable = true)
    public Date getBirth() {
        return birth;
    }
 
    public void setBirth(Date birth) {
        this.birth = birth;
    }
 
    @Basic
    @Column(name = "CREATETIME", nullable = true)
    public Date getCreatetime() {
        return createtime;
    }
 
    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
 
 
    @Basic
    @Column(name = "DEPARTMENT_ID", nullable = true)
    public Department getDepartment() {
        return department;
    }
 
    public void setDepartment(Department department) {
        this.department = department;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<hibernate-mapping>
 
    <class name="com.entities.Department" table="department" schema="ssh">
        <id name="id">
            <column name=" ID" sql-type="int(11)"/>
            <generator class="native"/>
        </id>
        <property name="departmentname">
            <column name="DEPARTMENTNAME" sql-type="varchar(255)" not-null="true"/>
        </property>
    </class>
</hibernate-mapping>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<hibernate-mapping>
 
    <class name="com.entities.Employee" table="employee" schema="ssh">
        <id name="id">
            <column name="ID" sql-type="int(11)"/>
            <generator class="native"/>
        </id>
        <property name="lastname">
            <column name="LASTNAME" sql-type="varchar(255)" not-null="true"/>
        </property>
        <property name="email">
            <column name="EMAIL" sql-type="varchar(255)" not-null="true"/>
        </property>
        <property name="birth">
            <column name="BIRTH" sql-type="date" not-null="true"/>
        </property>
        <property name="createtime">
            <column name="CREATETIME" sql-type="date" not-null="true"/>
        </property>
 
        <many-to-one name="department" class="com.entities.Department">
            <column name="DEPARTMENT_ID"/>
        </many-to-one>
    </class>
</hibernate-mapping>

      

  至此:打开Tomcat来运行,如果各方面配置没问题,就可以自动生成数据表了。

   



3.开始操作数据:写一个业务获取数据(数据由自己填充 )

EmployeeDao.java

这里的sessionfactory通过set的方法获取.....  set方法把该类注入到bean管理器,获得sessionfactory    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.service;
 
import com.entities.Employee;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
 
import java.util.List;
 
 
public class EmployeeDao {
 
    private SessionFactory sessionFactory;
 
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
 
    public Session getSession() {
 
        return sessionFactory.getCurrentSession();
 
    }
 
    public List<Employee> getAll() {
 
 
        //      左向外联获取department信息,fetch获取单一信息,不用获取一大堆
        String hql = "from Employee e left outer join fetch e.department";
 
        return getSession().createQuery(hql).list();
    }
}

  

再写一个service把上面的业务结果中转(自己形象地 理解 )

EmployeeService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.service;
 
import com.entities.Employee;
 
import java.util.List;
 
 
public class EmployeeService {
 
    private EmployeeDao employeeDao;
 
    public void setEmployeeDao(EmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }
 
    public List<Employee> getAll() {
 
        return employeeDao.getAll();
    }
}



4.到了这里,就需要写struts2的东西了,首先    在web的开始页面写一个action超链接

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
 
<a href="emp-list">List all Employees</a>
 
</body>
 
</html>

  实现这个效果,点击后就出现查询结果:


接着需要实现这个挑战的action,需要在struts.xml中注册这个action的信息,这里用通配符共用这个action

struts.xml


这里的employeeAction就是spring中已经注入的bean的id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 
<struts>
 
    <!--打开开发者模式,如有bug会显示之类,不过也消耗性能-->
    <constant name="struts.devMode" value="true"/>
    <!--关闭动态方法调用,这样就不能在浏览器通过调用类方法来调用action了-->
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
 
    <!--引用默认配置-->
    <package name="default" extends="struts-default">
 
        <!--通配符表示多种类似的方法共用一个模块,这里就是数据交互出,自己的理解-->
        <action name="emp-*" class="employeeAction" method="{1}">
            <result name="list">/WEB-INF/pages/emp-list.jsp</result>
        </action>
 
    </package>
 
</struts>

  

再写一个关于处理与struts相关bean的spring容器文件,其实是一个样的

applicationContext-beans.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
 
 
    <!--通过set方法把emplayDao注入到bean中,在EmployeeDao使用到sessionFactory-->
    <bean id="employeeDao" class="com.service.EmployeeDao">
        <property name="sessionFactory" ref="sessionFactory"/>
 
    </bean>
 
    <!--同上-->
    <bean id="employeeService" class="com.service.EmployeeService">
        <property name="employeeDao" ref="employeeDao"/>
 
    </bean>
 
    <!--配置action,这里在struts.xml的action会与此绑定,进行数据交互,scope="prototype"确保每个请求都是一个新的action,不能使用单例,那样的话,就会出现信息错乱-->
    <bean id="employeeAction" class="com.actions.EmployeeAction" scope="prototype">
 
        <property name="employeeService" ref="employeeService"/>
 
    </bean>
 
 
</beans>


最后,就需要写数据的交汇点,EmployeeAction.java了

这里就把EmployeeService.java查询得来的数据写入到值栈中,一边在jsp中读取并且显示..       

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.actions;
 
import com.opensymphony.xwork2.ActionSupport;
import com.service.EmployeeService;
import org.apache.struts2.interceptor.RequestAware;
 
import java.util.Map;
 
 
public class EmployeeAction extends ActionSupport implements RequestAware {
 
    private EmployeeService employeeService;
 
    public void setEmployeeService(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }
 
    public String list() {
 
        request.put("employee", employeeService.getAll());
 
        return "list";
    }
 
    private Map<String, Object> request;
 
    @Override
    public void setRequest(Map<String, Object> map) {
 
 
        this.request = map;
    }
 
 
}

       

最后完善显示结果的jsp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 
<h4>Employee List Page</h4>
 
<s:if test="#request.employee==null||request.employee.size()==0">
    没有任何员工信息
</s:if>
<s:else>
    <table border="1" cellpadding="2" cellspacing="0">
 
        <tr>
            <td>ID</td>
            <td>LAST_NAME</td>
            <td>E_MAIL</td>
            <td>BIRTH</td>
            <td>CREATE_TIME</td>
            <td>DEPARTMENT</td>
        </tr>
        <s:iterator value="#request.employee">
 
            <tr>
                <td>${id}</td>
                <td>${lastname}</td>
                <td>${email}</td>
                <td>${birth}</td>
                <td>${createtime}</td>
                <td>${department.departmentname}</td>
            </tr>
 
 
        </s:iterator>
    </table>
</s:else>
 
 
</body>
</html>

  


6.文件一览:




运行结果:


   





原文地址:https://www.cnblogs.com/share2015/p/5299138.html