El establecimiento de todo un proyecto web simple basado en SSH (incluidos los archivos de configuración) [El software utilizado es IntelliJ IDEA 2018.3.3 x64, el entorno operativo es tomcat]

                       **
base de datos sql de emp;
Inserte la descripción de la imagen aquí

2. El directorio de archivos aproximado de todo el proyecto es como se muestra en la Figura
Inserte la descripción de la imagen aquí
2.1 Primero, agregue algunos archivos especiales de acuerdo con el directorio de archivos como se muestra arriba, y agréguelos de acuerdo a sus necesidades.
2.2 Para resolver todo el proceso de pensamiento de SSH, utilice todo el proceso en SSH como se muestra a continuación: [El proceso completo se describe en el orden de un proyecto combinado con el proceso ssh]
Inserte la descripción de la imagen aquí
      *** ~~

2.2.1

~~ *** Cuando se inicia un proyecto, independientemente de si hay contenido en el proyecto, debe haber un archivo de configuración web.xml.
      El contenido del archivo de configuración web.xml es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <!--用监听器启动spring-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!--加载spring配置文件-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/ApplicationContext.xml</param-value>
  </context-param>
  <!--启动struts2-->
  <filter>
    <filter-name>struts2</filter-name>
    <!--过滤器的全类限定名-->
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <!--要拦截的目标-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

      **

2.2.2

** El usuario pasa por la capa web, es decir, la página web en el proyecto web. En este proyecto es index.html y jsp (página del servidor java) * Nota: La entrada de todo el proyecto es index.html página cuando Tomcat se está ejecutando .
     
El código index.html es el siguiente:

  <%--
  Created by IntelliJ IDEA.
  User: xionghaizi
  Date: 2019/6/21
  Time: 14:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>页面</title>
</head>
<body>
   <a href="${pageContext.request.contextPath}/empAction!findEmpAll.action">查询全部</a>
</body>
</html>

Nota: $ {pageContext.request.contextPath} es para obtener el contexto
$ {pageContext.request.contextPath} /empAction!findEmpAll.action es para ir a la capa de servicio para operar a través de Action. // Si no lo entiende, puede leerlo primero, no afectará.

      El código de emp / list.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>显示所有员工</title>
</head>
<body>
      <%--${empList}--%>
    <table border="1" align="center">
           <tr>
               <th>编号</th>
               <th>姓名</th>
               <th>年龄</th>
               <th>地址</th>
               <th>生日</th>
               <th>操作</th>
           </tr>

        <c:forEach items="${empList}" var="emp">
            <tr>
                <td>${emp.id}</td>
                <td>${emp.name}</td>
                <td>${emp.age}</td>
                <td>${emp.address}</td>
                <td>${emp.birthday}</td>
                <td>
                    <a href="${pageContext.request.contextPath}/empAction!editPage.action?id=${emp.id}">修改</a>
                    <a href="${pageContext.request.contextPath}/empAction!deleteEmp.action?id=${emp.id}">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

Nota: si usa <c: forEach> </ c: forEach>, debe introducir <% @ taglib prefix = “c” uri = “ http://java.sun.com/jsp/jstl/core ”%>

      código emp / edit.jsp:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/6/21
  Time: 11:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>修改员工信息</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/empAction!editEmp.action" method="post">
    <p>编号:<input type="text" name="emp.id" value="${emp.id}"> </p>
    <p>姓名:<input type="text" name="emp.name" value="${emp.name}"> </p>
    <p>年龄:<input type="text" name="emp.age" value="${emp.age}"> </p>
    <p>地址:<input type="text" name="emp.address" value="${emp.address}"> </p>
    <p>生日:<input type="date" name="emp.birthday" value="${emp.birthday}"> </p>
    <p><input type="submit"  value="修改保存"> </p>
</form>
</body>
</html>

Captura de pantalla de operación de interfaz 1: Después de
Inserte la descripción de la imagen aquí
hacer clic en Consultar todo, se mostrarán todos los contenidos: como en la captura de pantalla 2
Inserte la descripción de la imagen aquí
     , haga clic en Modificar: Captura de pantalla 3: Después de
Inserte la descripción de la imagen aquí
      guardar la modificación, será redirigido a la página que muestra todos los contenidos, que es similar a la captura de pantalla 1., Haga clic en la operación de eliminación es la misma.
Se ha descrito la función general de la operación de página. El siguiente paso es avanzar el código como la capa de servicio.
**

      2.2.3

**
Haga clic para mostrar toda la información en index.html y luego saltar. Esta operación debe pasar por la capa de servicio y mostrarse en este proyecto, que es la siguiente operación de Java.
Inserte la descripción de la imagen aquí
     Esto incluye acción, servicio, dao y entidad. Esta secuencia es también la secuencia que se ejecutará en la capa de servicio después de hacer clic en el botón de la página web.

Como explica el nombre, sin demasiada introducción, lo más importante es la acción, porque esta equivale a la clave que la web puede transferir a la capa de servicio, y por seguridad y muchas otras consideraciones, se detectará y filtrará, que es Struts (filtro) en ssh.
Archivo de configuración struts.xml [Si necesita una explicación específica sobre el archivo de configuración, consulte mi blog anterior sobre Struts]

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

<struts>
    <!--常亮-->
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <constant name="struts.i18n.encoding" value="UTF-8"/>

    <package name="emp" extends="struts-default">
        <global-allowed-methods>regex:.*</global-allowed-methods>
        
        <action name="empAction" class="com.whpu.k16035.action.EmpAction" >
            <result name="list">/jsp/emp/list.jsp</result>
            <result name="edit">/jsp/emp/edit.jsp</result>
            <!--重定向-->
            <result name="requert" type="redirect">empAction!findEmpAll.action</result>
        </action>
    </package>
</struts>

     Lo siguiente sobre la capa de servicio directamente al código:

     Código de acción / Empacción:

package com.whpu.k16035.action;

import com.whpu.k16035.entity.Emp;
import com.whpu.k16035.service.EmpService;

import java.util.List;

/**
 * 控制器:处理请求
 */
public class EmpAction {
    //服务层
    private EmpService empService;
    //传递数据
    private List<Emp> empList;
    //获取id
    private Integer id;
    //对象
    private Emp emp;

    //查询全部
    public String findEmpAll(){
        //调用服务层的查询全部方法
        empList=empService.selectEmpAll();
        return "list";
    }

    //删除
    public String deleteEmp(){
        //调用服务层的删除方法
        empService.deleteEmp(id);
        //重定向到查询全部
        return "requert";
    }

    //    修改查询 editPage
    public String editPage(){
        //调用服务层的查询单挑的方法
        emp=empService.findEmpById(id);
        //跳转到修改页面
        return "edit";
    }

    //    修改保存数据 editEmp
    public String editEmp(){
        //调用服务层的修改方法
        empService.editEmp(emp);
        //重定向到查询全部的方法去
        return "requert";
    }

    // --------------------------------------
    public List<Emp> getEmpList() {
        return empList;
    }

    public void setEmpList(List<Emp> empList) {
        this.empList = empList;
    }

    public EmpService getEmpService() {
        return empService;
    }

    public void setEmpService(EmpService empService) {
        this.empService = empService;
    }

    public Integer getId() {
        return id;
    }

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

    public Emp getEmp() {
        return emp;
    }

    public void setEmp(Emp emp) {
        this.emp = emp;
    }
}

Nota: varios lugares que deben abordarse en struts.xml y EmpAction.java: [marcado en negrita]

<result name = "list" > /jsp/emp/list.jsp
<result name = "edit" > / jsp / emp / edit.jsp

<nombre de resultado = "requert" type = "redirect"> empAction! findEmpAll.action

código dao / EmpDao:

package com.whpu.k16035.dao;
import com.whpu.k16035.entity.Emp;
import java.util.List;
/**
 *  持久层的接口
 */
public interface EmpDao {
    //查询全部
    List<Emp> selectEmpAll();
  //删除
    void deleteEmp(Emp emp);
  //查找单条数据
    Emp findEmpById(Integer id);
  //修改
    void editEmp(Emp emp);
}

Código dao / impl / EmpDaoImpl:

package com.whpu.k16035.dao.impl;
import com.whpu.k16035.dao.EmpDao;
import com.whpu.k16035.entity.Emp;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import java.util.List;

/**
 *  持久层  操作数据库
 *
 */
public class EmpDaoImpl extends HibernateDaoSupport implements EmpDao {
    //查询全部
    @Override
    public List<Emp> selectEmpAll() {
        return (List<Emp>)this.getHibernateTemplate().find("From Emp");
    }
    //删除数据
    @Override
    public void deleteEmp(Emp emp) {
        getHibernateTemplate().delete(emp);
    }
    //查询单条
    @Override
    public Emp findEmpById(Integer id) {
        return getHibernateTemplate().get(Emp.class,id);
    }
    //修改保存
    @Override
    public void editEmp(Emp emp) {
        getHibernateTemplate().update(emp);
    }
}

servicio / código EmpService:

package com.whpu.k16035.service;
import com.whpu.k16035.entity.Emp;

import java.util.List;
/**
 * 服务层 处理业务逻辑的
 *        事物管理
 */
public interface EmpService {
    //查询全部
    List<Emp> selectEmpAll();
    //删除数据
    void deleteEmp(Integer id);
    //查询单条
    Emp findEmpById(Integer id);
    //修改
    void editEmp(Emp emp);
}

service / impl.EmpServiceImpl código:

package com.whpu.k16035.service.impl;

import com.whpu.k16035.dao.EmpDao;
import com.whpu.k16035.dao.impl.EmpDaoImpl;
import com.whpu.k16035.entity.Emp;
import com.whpu.k16035.service.EmpService;

import java.util.List;

/**
 *  服务层的实现类
 */
public class EmpServiceImpl implements EmpService {
    //创建持久层对象
    //private EmpDao empDao =new EmpDaoImpl();
    private EmpDao empDao;
    //查询全部
    @Override
    public List<Emp> selectEmpAll() {
        return empDao.selectEmpAll();
    }
    //删除
    @Override
    public void deleteEmp(Integer id) {
        Emp emp = new Emp();
        emp.setId(id);
        empDao.deleteEmp(emp);
    }
    @Override
    public Emp findEmpById(Integer id) {
        return empDao.findEmpById(id);
    }
    @Override
    public void editEmp(Emp emp) {
        empDao.editEmp(emp);
    }
    //-------------------
    public EmpDao getEmpDao() {
        return empDao;
    }

    public void setEmpDao(EmpDao empDao) {
        this.empDao = empDao;
    }
}

entidad / código Emp:

package com.whpu.k16035.entity;

import java.util.Date;

public class Emp {
    //创建与表对应的属性
    private Integer id;
    private String name;
    private Integer age;
    private String address;
    private Date birthday;
    //构造方法  一定要有无参构造
    public Emp() {
    }
    //setter getter
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

**

      2.2.4

**
Archivo de mapeo de Hibernate, archivo hibernate.xml: Esta es la capa de persistencia, que es la última capa en conectarse a la base de datos. Hibernate puede simplificar el funcionamiento de la base de datos.
     1. Cree el archivo de asignación de clase de entidad
            Emp.hbm.xml
      2. Cree el archivo de configuración principal de Hibernate
            hibernate.cfg.xml

Código del archivo de configuración emp.hbm.xml:

<?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.whpu.k16035.entity">
     <class name="Emp" table="emp">
         <id name="id" column="id" type="java.lang.Integer">
             <generator class="native"/>
         </id>
         <property name="name" type="java.lang.String">
             <column name="name" length="64"/>
         </property>
         <property name="age" type="java.lang.Integer" column="age"/>
         <property name="address" type="java.lang.String" column="address"></property>
         <property name="birthday" type="java.sql.Date" column="birthday"></property>
     </class>
</hibernate-mapping>

Código de configuración hibernate.cfg.xml:

<?xml  version="1.0" encoding="UTF-8"  ?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--方言-->
        <!--<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>-->
        <!--&lt;!&ndash;连裤四要素&ndash;&gt;-->
        <!--<property name="connection.url">jdbc:mysql://localhost:3306/test4?characterEncoding=utf-8</property>-->
        <!--<property name="connection.driver_class">com.mysql.jdbc.Driver</property>-->
        <!--<property name="connection.username">root</property>-->
        <!--<property name="connection.password">123</property>-->
        <!--现实sql语句-->
        <!--<property name="show_sql">true</property>-->
        <!--&lt;!&ndash;启动是建表的类型&ndash;&gt;-->
        <!--<property name="hbm2ddl.auto">update</property>-->
        <!--&lt;!&ndash;映射文件&ndash;&gt;-->
        <!--<mapping resource="mapper/Emp.hbm.xml"/>-->
    </session-factory>
</hibernate-configuration>

Nota: Algunas personas pueden tener preguntas sobre esto. ¿Por qué SSH habla de Struts e Hibernate, y no hay nada en el archivo de configuración de Hibernate? Esta es la primavera de la que quiero hablar. Desde el principio, la idea de SSH es obvio, se puede ver que Spring se ejecuta a través de todo el proceso, y el contenido de la configuración principal de Hibernate está en el archivo de configuración relacionado con Spring, por lo que se puede anotar.
**

      2.2.4: Archivo de configuración de contexto ApplicationContext.xml en Spring

**
Código:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--1.加载连库四要素-->
    <context:property-placeholder location="classpath:dbconfig/dbmysql.properties" />
    <!--2.创建数据库连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--创建sessionFactroy-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <!--数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--加载hibernate主配置文件-->
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
        <!--加载实体类映射文件-->
        <property name="mappingLocations" value="classpath*:mapper/*.hbm.xml"/>
        <!--hibernate的其他配置-->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="format_sql">true</prop>
                <prop key="hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <!--事物管理-->
    <!--事物管理器-->
    <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!--事物传播特性-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*"/>
            <!--select*  方法设置只-->
            <tx:method name="select*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!--事物切面-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.whpu.k16035.service.impl.*.*(..))"></aop:pointcut>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>

    <!--dao层-->
    <bean id="empDao" class="com.whpu.k16035.dao.impl.EmpDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!--服务层-->
    <bean id="empService" class="com.whpu.k16035.service.impl.EmpServiceImpl">
        <property name="empDao" ref="empDao"/>
    </bean>

    <!--控制器-->
    <bean id="empAction" class="com.whpu.k16035.action.EmpAction" scope="prototype">
        <property name="empService" ref="empService"/>
    </bean>

</beans>

En este punto, todo el proceso de implementación de SSH se ha completado básicamente, solo algunas configuraciones del entorno y otras deben ser completadas por usted mismo.
Espero que mi organización pueda serle útil. ^ - ^
                                                                                                de Xiong xyi.

Supongo que te gusta

Origin blog.csdn.net/qq_43479839/article/details/93200640
Recomendado
Clasificación