一.创建maven项目
eclipse版本4以上自带maven插件
File-》New-》MavenProject-》Next
设置groupId ArtifactId
groupId 通常为 域名反写.项目名
ArtifactId 通常为 项目名-模块名
二.消除eclipse项目上的红叉
1.
右击项目名-》BuildPath-》Configure Build Path
将missing的文件夹移除(Remove)
右击项目名,新增移除的两个文件夹
src/main/java
src/test/java
2.
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
这是由于未添加依赖servlet-api
此时在pom.xml中添加如下依赖
<dependency>
<groupId>com.hynnet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 只在编译测试时运行 -->
<scope>provided</scope>
</dependency>
pom.xml上右击-》run As-》Maven build.. install命令
发现该项目上的红叉消失了。
三.简单项目代码
项目目标:从jsp网页上输入商品的名称和价格,添加到数据库中
1.包结构
还有一个addProduct.jsp在webApp目录下
2.pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.byf.webDemo</groupId>
<artifactId>webDemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>webDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- 统一源码的编码方式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 统一各个框架版本 -->
<struts.version>2.5.10</struts.version>
<spring.version>4.3.8.RELEASE</spring.version>
<hibernate.version>5.1.7.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.hynnet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 只在编译测试时运行 -->
<scope>provided</scope>
</dependency>
<!-- Spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring整合ORM框架依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Struts2 核心依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<!-- Struts2和Spring整合依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts.version}</version>
</dependency>
<!-- Hibernate 核心依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- MySQL 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<!-- C3P0 依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5</version>
</dependency>
<!-- AspectJ依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<!-- SLF4J依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
<build>
<finalName>webDemo</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- <url>http://localhost:8080/manager</url> --> <!-- tomcat6部署管理路径 -->
<url>http://localhost:8080/manager/text</url> <!-- tomcat7部署管理路径 -->
<username>admin</username> <!-- tomcat的管理员账号 -->
<password>admin</password>
<port>9999</port>
<path>/webDemo</path> <!-- 部署路径 -->
<charset>UTF-8</charset>
<encoding>UTF-8</encoding>
<!-- 运行redeploy命令前,要能正常访问http://localhost:8080/manager -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3.struts.xml
<?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>
<package name="webDemo" extends="struts-default" namespace="/">
<!-- productAction为在spring中创建的action的id名 spring创建需要手动注入 -->
<action name="product_*" class="productAction" method="{1}">
</action>
</package>
</struts>
此处sturts.xml的配置 使得action对象的创建不是由struts2完成而是由spring来创建(既可通过struts2,也可通过spring)。官方推荐使用spring来创建
action对象的创建通过spring来创建时,有两点需要注意,
1.在spring的配置文件中(applicationContext.xml)需要手动注入Service对象
<!-- 配置Action的类 -->
<bean id="productAction" class="com.byf.webDemo.action.ProductAction">
<property name="productService" ref="productService"></property>
</bean>
2. 在Struts2,action的class属性的值productAction为在spring中创建的action的id名
4.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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 引入外部的属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置Hibernate的相关属性 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置Hibernate的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.fomat_sql">true</prop><!-- 是否格式化SQL -->
<prop key="hibernate.show_sql">true</prop><!-- 是否展示SQL -->
<prop key="hibernate.hbm2ddl.auto">update</prop><!-- 是否自动创建表结构 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
</props>
</property>
<!-- 加载Hibernate中的映射文件 -->
<property name="mappingResources">
<list>
<value>Product.hbm.xml</value>
</list>
</property>
</bean>
<!-- 配置连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置Action的类 -->
<bean id="productAction" class="com.byf.webDemo.action.ProductAction">
<property name="productService" ref="productService"></property>
</bean>
<!-- 配置业务层的类 -->
<bean id="productService" class="com.byf.webDemo.service.ProductService">
<property name="productDao" ref="productDao"></property>
</bean>
<!-- 配置Dao的类 -->
<bean id="productDao" class="com.byf.webDemo.dao.ProductDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
5.jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名字
jdbc.username=数据库用户名
jdbc.password=密码
根据自己的实际情况更改对应的数据库信息
hibernate会自动建表,库一定要存在,在cmd中使用 "create database 数据库名字;"建表 或者 使用数据库管理软件直接建表例如Navicat
6.log4j.properties
#定义LOG输出级别
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
7.Product.hbm.xml (Hibernate关系映射文件)
按照Hibernate插件,可根据实体类自动创建关系映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-8-6 14:45:17 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.byf.webDemo.domain.Product" table="PRODUCT">
<id name="pid" type="java.lang.Integer">
<column name="PID" />
<generator class="native" />
</id>
<property name="pname" type="java.lang.String">
<column name="PNAME" />
</property>
<property name="pprice" type="java.lang.Double">
<column name="PRICE" />
</property>
</class>
</hibernate-mapping>
8. 创建实体类 Product.java
package com.byf.webDemo.domain;
/**
* 商品实体
*/
public class Product {
private Integer pid;
private String pname;
private Double pprice;
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Double getPprice() {
return pprice;
}
public void setPrice(Double pprice) {
this.pprice = pprice;
}
}
9. 创建DAO类 ProductDao.java
package com.byf.webDemo.dao;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.byf.webDemo.domain.Product;
/**
* 商品管理Dao
* @author hp
*
*/
public class ProductDao extends HibernateDaoSupport{
public void save(Product product) {
// TODO Auto-generated method stub
System.out.println("DAO中的save方法调用了...");
this.getHibernateTemplate().save(product);
}
}
spring为hibernate的DAO提供工具类:HibernateDaoSupport。该类主要提供如下两个方法,方便DAO的实现:
public final HibernateTemplate getHibernateTemplate()
public final void setSessionFactory(SessionFactory sessionFactory)
其中,setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例,
getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后生成HibernateTemplate来完成数据库访问。
10. 创建Service类 ProductService.java
package com.byf.webDemo.service;
/**
* 商品管理的业务层类
*/
import org.springframework.transaction.annotation.Transactional;
import com.byf.webDemo.dao.ProductDao;
import com.byf.webDemo.domain.Product;
@Transactional
public class ProductService {
// 业务层注入Dao的类
private ProductDao productDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void save(Product product) {
System.out.println("Service方法中的 save方法执行了...");
productDao.save(product);
}
}
11. 创建Action类 ProductAction.java
package com.byf.webDemo.action;
import com.byf.webDemo.domain.Product;
import com.byf.webDemo.service.ProductService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class ProductAction extends ActionSupport implements ModelDriven<Product>{
// 模型驱动使用的类
private Product product = new Product();
@Override
public Product getModel() {
// TODO Auto-generated method stub
return product;
}
// Struts和Spring整合过程中按名称自动注入的业务层类
private ProductService productService;
public void setProductService(ProductService productService) {
this.productService = productService;
}
/**
* 保存商品的执行方法:save
*/
public String save() {
System.out.println("Action中的save 方法执行了...");
productService.save(product);
return NONE;
}
}
12. addProduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>保存商品的页面</h1>
<s:form action="product_save" method="post" namespace="/" theme="simple">
<table border="1" width="400">
<tr>
<td>商品名称</td>
<td><s:textfield name="pname"/>
</tr>
<tr>
<td>商品价格</td>
<td><s:textfield name="pprice"/>
</tr>
<tr>
<td colspan="2"><input type="submit" value="添加"/></td>
</tr>
</table>
</s:form>
</body>
</html>
13. 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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- Spring框架的核心监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定Spring配置文件所在路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Struts2的框架的核心过滤器的配置 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>addProduct.jsp</welcome-file>
</welcome-file-list>
</web-app>
四.运行项目
在pom.xml配置过插件,当运行package命令时,同时运行tomcat:run
运行前:数据库
在网页上输入数据:
点击添加按钮后,控制台输出 :
数据库更新后: