这里用的都是市面上通用的技术,而每个公司都有自己的调用方式,可以根据实际情况与业务场景不同去进行变通
三层架构:
界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。
Servlet项目
1、静态资源需要放在WebContent文件下,不应该在web-inf文件下
一:项目结构:
二:底层数据连接:
/**
* 数据库连接
* @author 明
*
*/
public class ConnDB {
private static String driver;
private static String url;
private static String user;
private static String pwd;
/**
* 加载连接条件
*/
static{
try {
Properties properties=new Properties();
InputStream inputStream=ConnDB.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(inputStream);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
pwd = properties.getProperty("password");
Class.forName(driver);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 数据库连接
* @return
*/
public static Connection getConnection(){
Connection conn=null;
try {
conn=DriverManager.getConnection(url, user, pwd);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 关闭连接属性
*/
public static void cose(ResultSet resultSet,PreparedStatement preparedStatement,Connection conn){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
数据处理使用工厂方式:增强通用性,会牺牲点性能
案列:
@Override
public Boolean loginUser(String userName, String userPassword) {
boolean falg = false;
Connection getconn = connDB();
String sql = "select * from user u where u.user_name=? and u.user_password=?";
try {
preparedStatement = getconn.prepareStatement(sql);
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userPassword);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
falg = true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {//回收资源
ConnectionDBUtil.geetConnClose(resultSet,preparedStatement,connDB());
}
return falg;
}
三:数据业务处理:
四:前后台数据交互:
MVC设计:
小型架构目录
├──pom.xml
├──main
| ├──java
| | └──com
| | └──web
| | ├── core
| | | ├── controller //控制器包
| | | ├── entity //POJO包
| | | ├── mapper //Mapper接口包
| | | ├── service //Service接口包
| | | └── serviceImpl //service实现类包
| | └──util //工具包
| ├── resources //资源文件夹(配置文件)
| | ├──applicationContext.xml //Spring配置文件
| | ├──dbconfig.properties //数据库配置文件
| | ├──log4j.properties //log4j配置文件
| | ├──mybatis-config.xml //mybatis配置文件
| | ├──spring-mvc.xml //springMvc配置文件
| | ├──spring-mybatis.xml //spring-mybatis整合配置
| | └── mapping //mapper.xml文件夹
| | └── StudentMapper.xml
| └── webapp ///web应用部署根目录
| ├──login.html //登录页
| ├──pages //jsp文件将爱
| | └── studentList.jsp
| ├──static //静态资源文件夹
| | ├──css
| | | └── login.css
| | ├──images
| | | ├──login-img.png
| | | └── login_logo.png
| | └── js
| | └── JQuery.js
| └── WEB-INF //
| └── web.xml
└──test
├── java
├── resources
SSH项目(spring+struts+hibernate)
常用注解:
1、Hibernate框架的
Hibernate的注解主要用在持久化类那一块:
@Entity
指定当前类是实体类。
@Entity
public class User() {
private Integer id;
private String name;
}
@Table
指定实体类和数据库表之间的对应关系。
属性:
name:指定数据库表的名称
@Entity
@Table(name="t_user")
public class User() {
private Integer id;
private String name;
}
@Id
指定当前字段是主键。
@Entity
@Table(name="t_user")
public class User() {
@Id
private Integer id;
private String name;
}
@GeneratedValue
指定主键的生成方式。
属性:
strategy :指定主键生成策略。
JPA 提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。
@Entity
@Table(name="t_user")
public class User() {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
private String name;
}
@Column
指定实体类属性和数据库表字段之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
@Entity
@Table(name="t_user")
public class User() {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id")
private Integer id;
@Column(name = "user_name")
private String name;
}
@Temporal
设置日期时间
1
方式一:@Temporal(TemporalType.DATE)映射为日期 // birthday date (只有日期)
方式二:@Temporal(TemporalType.TIME)映射为日期 // birthday time (是有时间)
方式三:@Temporal(TemporalType.TIMESTAMP)映射为日期 //birthday datetime (日期+时间)
@Temporal(TemporalType.DATE)
private Date birthday;
@Lob
作用:设置大数据类型
方式一:
@Lob
private String text; //text longtext
方式二:
@Lob
private byte[] image; // image longblob
@Enumerated
作用:设置枚举类型
方式一:
/** 保存字符串到数据库 */
@Enumerated(EnumType.STRING)
private Role role;
方式二:
/** 保存整数到数据库 */
@Enumerated(EnumType.ORDINAL)
private Role role;
上面定义的枚举:Role
/** 角色 */
public enum Role {
游客, 会员, 管理员
}
使用:
User user = new User();
user.setRole(Role.管理员);
@Transient
作用:修饰的字段不会被持久化
@Transient
private String temp;
这样也可以:
private transient String temp;
一对多涉及的注解:
@OneToMany:
作用:建立一对多的关系映射
属性:
targetEntityClass:指定多的多方的类的字节码
mappedBy:指定从表实体类中引用主表对象的名称。
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
orphanRemoval:是否使用孤儿删除
@ManyToOne
作用:建立多对一的关系
属性:
targetEntityClass:指定一的一方实体类字节码
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
optional:关联是否可选。如果设置为false,则必须始终存在非空关系。
@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
多对多涉及的注解:
@ManyToMany
作用:用于映射多对多关系
属性:
cascade:配置级联操作。
fetch:配置是否采用延迟加载。
targetEntity:配置目标的实体类。映射多对多的时候不用写。
@JoinTable
作用:针对中间表的配置
属性:
nam:配置中间表的名称
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段 inverseJoinColumn:中间表的外键字段关联对方表的主键字段
@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
2、Struts2框架的
@NameSpace
出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。
作用: 指定当前 Action 中所有动作方法的名称空间。
属性:
value: 指定名称空间的名称。写法和 xml 配置时一致。 不指定的话,默认名称空间是""。
@ParentPackage
出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。
作用: 指定当前动作类所在包的父包。由于我们已经是在类中配置了,所以无需在指定包名了。
属性:
value: 指定父包的名称。
@Action
出现的位置: 它只能出现在 Action 类上或者动作方法上。 一般情况下都是写在动作方法上。
作用: 指定当前动作方法的动作名称。 也就是 xml 配置时 action 标签的 name 属性。
属性:
value: 指定动作名称。
results[]: 它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用 response 输出响应正文。
interceptorRefs[]: 它是一个数组,数据类型是注解。用于指定引用的拦截器。
@Result
出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。
作用: 出现在类上,表示当前动作类中的所有动作方法都可以用此视图。出现在 Action 注解中,表示当前 Action 可用此视图。
属性:
name: 指定逻辑结果视图名称。
type: 指定前往视图的方式。 例如:请求转发,重定向,重定向到另外的动作。
location: 指定前往的地址。可以是一个页面,也可以是一个动作。
@Results
出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。
作用: 用于配置多个结果视图。
属性:
value: 它是一个数组,数据类型是 result 注解。
@InterceptorRef
出现的位置: 它可以出现在动作类上或者 Action 注解中。
作用: 用于配置要引用的拦截器或者拦截器栈
属性:
value: 用于指定拦截器或者拦截器栈
3、Spring框架的
1、IOC的注解
@Component :创建对象
@Controller
把视图层类交给Spring管理
@Controller
public class UserAction() {
}
@Service
把业务层类交给Spring管理
@Service
public class UserService() {
}
@Repository
把持久层类交给Spring管理
@Repository
public class UserDao() {
}
@Autowired
根据类型自动注入对象
@Autowired
private UserDao userDao;
@Qualifier
与上面的Autowired一起用,目的根据id获取对象
//例:把持久化层交给Spring管理,并在业务层通过id注入持久化层对象
@Repository("userDao")
public class UserDao() {}
@Service
public class UserService() {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Resource
可以根据类型注入,也可以根据id装配,name属性就是bean的id
@Resource(name="userDao")
private UserDao userDao;
@Value
注入基本类型和字符串类型
@Scope
单例与多例的配置,默认是单例
singleton(单例);prototype(多例);request session
//例:Action是多例的,所以应配置对应的属性,而dao层是单例的,不用配置
@Controller
@Scope(value="prototype")
public class UserAction() {
}
@Repository
public class UserDao() {
}
@Configuration :
定义配置类,用于替换spring中的xml文件的
@Configuration
public class SpringConfiguration {
}
@ComponentScan:
开启注解扫描
@Configuration
//@ComponentScan(basePackages={"cn"})
//@ComponentScan(value={"cn"})
@ComponentScan({"cn"})//value:指定扫描的包【推荐,因为可以不写】
public class SpringConfiguration {
}
@PropertySource
指定的配置文件
@Configuration
@PropertySource(value="classpath:/config/jdbc.properties")
public class SpringConfiguration {
/**
* 告诉spring框架开启el表达式
* 在4.3版本以前都需要这个占位符类
* 在4.3版本之后以下代码可以省略不写
*/
@Bean
public PropertySourcesPlaceholderConfigurer createPSPC(){
return new PropertySourcesPlaceholderConfigurer();
}
}
@Bean
用在方法上面,创建对象的,根据方法的返回类型
@Component
public class JdbcConfig {
@Bean(name="dataSource")//相当于:<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource" />
public DataSource createDataSource(){
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
try {
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/springIOC");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");
return comboPooledDataSource;
}
@Bean(name="queryRunner")
public QueryRunner createQr(@Qualifier(value="dataSource") DataSource dataSource){
return new QueryRunner(dataSource);
}
}
@Import
导入其他的配置类,交给Spring管理
1
@Configuration
@Import(value={JdbcConfig.class})
public class SpringConfiguration {
}
2、AOP的常用注解
AOP : 全称是Aspect Oriented Programming 即: 面向切面编程
需要在Spring的主配置文件中添加以下标签。开启aop注解的支持
<aop:aspectj-autoproxy/>
@Aspect
作用:把当前类声明为切面类。
@Aspect //声明为切面类
public class MyLogger {
}
@Before
作用:把当前方法看成是前置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//前置通知
@Before("pt1()")
public void beforePrintLog(){
System.out.println("前置通知:打印日志了......");
}
}
@AfterReturning
作用:把当前方法看成是后置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//后置通知
@AfterReturning("pt1()")
public void afterRetunningPrintLog(){
System.out.println("后置通知:打印日志了......");
}
}
@AfterThrowing
作用:把当前方法看成是异常通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//异常通知
@AfterThrowing("pt1()")
public void afterThrowingPrintLog(){
System.out.println("异常通知:打印日志了......");
}
}
@After
作用:把当前方法看成是最终通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//最终通知
@After("pt1()")
public void afterPrintLog(){
System.out.println("最终通知:打印日志了......");
}
}
@Around
作用:把当前方法看成是环绕通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Pointcut
作用:指定切入点表达式
属性:
value:指定表达式的内容
/**
* 切入点
*/
@Pointcut("execution(public void cn.service.impl.CustomerServiceImpl.saveCustomer())")
public void pt1(){}
/**
* 环绕通知:
* 是spring提供给我们的手动控制代码执行的通知,
* 方法中需要手动控制方法执行
*
* 参数中需要一个接口:Spring注入的,了解
* ProcedingJoinPoint
*/
@Around("pt1()")
public Object around(ProceedingJoinPoint pjp){
//System.out.println("最终通知:打印日志......");
Object[] obj = pjp.getArgs();//参数
//返回值
Object rtValue = null;
//手动调用方法
try {
//前置通知
System.out.println("前:打印日志");
pjp.proceed(obj);
//后置通知
System.out.println("后:打印日志");
} catch (Throwable e) {
//异常通知
System.out.println("异:打印日志");
e.printStackTrace();
}finally{
//最终通知
System.out.println("终:打印日志");
}
return rtValue;
}
3、事务的注解
@Transactiona
声明在类上是表示全局事务,声明在方法上表示局部事务,局部事务会覆盖全局事务,默认属性是传播事务,非只读
@Transactional(readOnly=true)
public class AccountServiceImpl implements IAccountService {
public Account findAccountById(Integer id) {
return ad.findAccountById(id);
}
}
@EnableTransactionManagement
开启事务管理器
@Configuration
@EnableTransactionManagement
public class SpringConfiguration {
}
版权声明:本文为CSDN博主「I7show」的原创文章
原文链接:https://blog.csdn.net/I7show/article/details/78843417
log4j.properties:
log4j.rootLogger = DEBUG , C , D , E
### console ###
log4j.appender.C = org.apache.log4j.ConsoleAppender
log4j.appender.C.Target = System.out
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
### log file ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ../logs/mybatis_study.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
### exception ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ../logs/mybatis_study_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
###mybatis show sql###
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
spring-hibernate.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"
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-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- 导入外部资源文件
system-properties-mode:FALLBACK 默认值,不存在时覆盖
NEVER 不覆盖
OVERRIDE 覆盖-->
<context:property-placeholder location="classpath:jdbc.properties"
system-properties-mode="FALLBACK"/>
<!-- 自动扫描dao和service包(自动注入) -->
<context:component-scan base-package="com.hm.dao"/>
<!-- 使用C3P0数据源,MySQL数据库 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- MySQL5 -->
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="1"/>
<property name="initialPoolSize" value="1"/>
<property name="maxIdleTime" value="20"/>
</bean>
<!-- session工厂 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Hibernate属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- 配置C3P0数据源连接池 -->
<prop key="hibernate.c3p0.max_size">10</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.acquire_increment">2</prop>
<prop key="hibernate.c3p0.idle_test_period">2000</prop>
<prop key="hibernate.c3p0.timeout">2000</prop>
<prop key="hibernate.c3p0.max_statements">10</prop>
<prop key="current_session_context_class">thread</prop>
</props>
</property>
<!-- 扫描POJO文件 -->
<property name="packagesToScan">
<list>
<value>com.hm.vo</value>
</list>
</property>
</bean>
<!-- 配置事务 -->
<bean name="txManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
struts2.xml:分成多个struts2文件,然后导入一个struts2文件中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 系统登录的struts配置 -->
<!--设置项目默认的编码方式 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--当出现错误是,出现更多的错误提示 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="false" />
<!--后台系统 -->
<package name="page" namespace="/" extends="struts-default">
<!--用户和图书的curd -->
<action name="bm_*" class="com.jd.bms.sysmannage.action.CrudPageAction"
method="{1}Book">
<result name="getId">/WEB-INF/pages/system/booksystem/Bookmainshow.jsp
</result>
<result name="add">/WEB-INF/pages/system/booksystem/Bookmainadd.jsp
</result>
<result name="input">/WEB-INF/pages/system/error/Bookmainerror.jsp</result>
<result name="update">/WEB-INF/pages/system/booksystem/Bookmainupdate.jsp
</result>
<result name="adds" type="redirect">/bookshow</result>
<result name="Childadds" type="redirect">/bookshowtwo</result>
<result name="Itadds" type="redirect">/bookshowthree</result>
<result name="bankadd">/WEB-INF/pages/system/classification/Bookbankadd.jsp</result>
<result name="bankadds" type="redirect">/bookbank</result>
<result name="addUser">/WEB-INF/pages/system/usersystem/useradd.jsp</result>
<result name="usermainpage" type="redirect">/usermain</result>
</action>
<!--分页查询图书 -->
<action name="bookshow" class="com.jd.bms.sysmannage.action.PagingAction"
method="bookshow">
<result name="bookshow">/WEB-INF/pages/system/booksystem/Bookmain.jsp</result>
</action>
<action name="bookshowtwo" class="com.jd.bms.sysmannage.action.PagingAction"
method="bookshowtwo">
<result name="bookshowtwo">/WEB-INF/pages/system/booksystem/Bookmain.jsp</result>
</action>
<action name="bookshowthree" class="com.jd.bms.sysmannage.action.PagingAction"
method="bookshowthree">
<result name="bookshowthree">/WEB-INF/pages/system/booksystem/Bookmain.jsp</result>
</action>
<!-- 分页图书种类 -->
<action name="bookbank" class="com.jd.bms.sysmannage.action.PagingAction" method="bookbank">
<result name="bookbank">/WEB-INF/pages/system/classification/Bookbank.jsp</result>
</action>
<!--用户信息分页 -->
<action name="usermain" class="com.jd.bms.sysmannage.action.PagingAction"
method="usermain">
<result name="usermain">/WEB-INF/pages/system/usersystem/usermain.jsp</result>
</action>
<!--用户信息搜索 -->
<action name="user_page" class="com.jd.bms.sysmannage.action.BmUserAction" method="user_page">
<result name="input">/WEB-INF/pages/system/error/Bookmainerror.jsp</result>
<result name="user_page">/WEB-INF/pages/system/usersystem/usermain.jsp</result>
<result name="usermain_page" type="redirect">/usermain</result>
</action>
<!--留言管理:查看、回复、删除 -->
<action name="messagex" class="com.jd.bms.sysmannage.action.BmLeaveWordAction" method="messagex">
<result name="messagex">/WEB-INF/pages/system/message/userleavemain.jsp</result>
</action>
<action name="delmess" class="com.jd.bms.sysmannage.action.BmLeaveWordAction" method="delmess">
<result name="delmess" type="redirect">/messagex</result>
</action>
<!--管理员、信息查询、修改,添加管理员,管理员权限控制 -->
<action name="adminmess" class="com.jd.bms.sysmannage.action.BmAdminAction" method="adminmess">
<result name="admin">/WEB-INF/pages/system/administrator/administrator.jsp</result>
</action>
<action name="amdin_*" class="com.jd.bms.sysmannage.action.BmAdminAction" method="{1}Admin">
<result name="updateAdmin" type="redirect">/adminmess</result>
</action>
<!--用户购书的记录 -->
<!-- <action name="userBokk" class="" method="userBokk">
<result name="userBokk"></result>
</action> -->
<!-- 前端页面 -->
<!--注册 -->
<action name="engi" class="com.jd.bms.sysmannage.action.EngiAction"
method="engi">
<result name="toLogin" type="redirect">/toLogin</result>
<result name="regiPage">/registers.jsp</result>
</action>
<!--进入登录页面 -->
<action name="toLogin" class="com.jd.bms.sysmannage.action.LoginAction"
method="toLogin">
<result name="toLogin">/login.jsp</result>
</action>
<!--登录判断是否成功否则进入原页面 -->
<action name="login" class="com.jd.bms.sysmannage.action.LoginAction"
method="login">
<result name="main" type="redirect">/main</result>
<result name="usermain" type="redirect">/usermain</result>
<result name="loginPage">/login.jsp</result>
</action>
<action name="add_*" class="com.jd.bms.sysmannage.action.BmLeaveWordAction" method="{1}LeaveWord">
<result name="message" type="redirect">/message</result>
</action>
<!--个人信息 -->
<action name="person" class="com.jd.bms.sysmannage.action.BmUserAction" method="person">
<result name="person">/WEB-INF/pages/forepart/main/personmain.jsp</result>
</action>
<!--个人信息修改 -->
<action name="userupdate" class="com.jd.bms.sysmannage.action.BmUserAction" method="userupdate">
<result name="userupdate" type="redirect">/person</result>
<result name="input">/WEB-INF/pages/forepart/main/personmain.jsp</result>
</action>
<!-- 进入用户密码修改页面 -->
<action name="pwdmodil" class="com.jd.bms.sysmannage.action.BmUserPwdAction" method="pwdmodil">
<result name="pwd">/WEB-INF/pages/forepart/main/modelfoactionmain.jsp</result>
</action>
<!--修改密码后进入登录页面 -->
<action name="pwdupdate" class="com.jd.bms.sysmannage.action.BmUserPwdAction" method="pwdupdate">
<result name="pwdupdate">/WEB-INF/pages/forepart/main/modelfoactionmain.jsp</result>
<result name="toLogin" type="redirect">/toLogin</result>
</action>
<!--查询仓库中的书本数据 -->
<action name="bookshop" class="com.jd.bms.sysmannage.action.BookshopAction" method="bookshop">
<result name="bookshop">/WEB-INF/pages/forepart/main/bookshopsmain.jsp</result>
</action>
<!--插入书籍到用户仓库 返回到原视图 -->
<action name="adds_*" class="com.jd.bms.sysmannage.action.BookshopAction" method="{1}Book">
<result name="libBook" type="redirect">/main</result><!--首页 -->
<result name="literyBook" type="redirect">/Literary</result><!-- 文学页面 -->
<result name="childBook" type="redirect">/Child</result><!--少儿童书页 -->
<result name="bmitBook" type="redirect">/itbook</result>
</action>
<!--删除书籍 -->
<action name="delBook" class="com.jd.bms.sysmannage.action.BookshopAction" method="delBook">
<result name="delBook" type="redirect">/bookshop</result>
</action>
</package>
</struts>
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hm</groupId>
<artifactId>ssh</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssh Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.2.9.RELEASE</spring.version>
<hibernate.version>5.1.7.Final</hibernate.version>
<struts2.version>2.3.32</struts2.version>
</properties>
<dependencies>
<!-- C3P0 依赖 注意不能少jar包、核心包有版本控制不低于0.9.5.2 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.15</version>
</dependency>
<!--JDK11 JAXB api被认为是Java EE api,因此不再包含在Java SE 9默认的类路径。在Java中11他们完全从JDK中删除-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<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>${struts2.version}</version>
</dependency>
<!-- Struts2和Spring整合依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2.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>
<!-- 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>ssh</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<extdirs>sshlib</extdirs>
</compilerArguments>
</configuration>
</plugin>
<!-- <plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat8-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>8081</port>
<path>/</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>
session类:
public class MySession {
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected Session getCurrentSession() {
return this.sessionFactory.getCurrentSession();
}
}
dao层:
@Repository("bmAdminDao")
public class BmAdminDaoImpl extends MySession implements BmAdminDao {
@Override
public List<BmAdmin> getBmAdminLoginName(String loginname) {
List<BmAdmin> list = null;
Query q = this.getCurrentSession()
.createQuery("from BmAdmin where loginName=?")
.setString(0, loginname);
list = q.list();
if (list.size() >= 0 && list != null) {
return list;
}
return null;
}
}
service层:
@Service
@Transactional
public class BmAdminServiceImpl implements BmAdminService {
@Autowired
private BmAdminDao bmAdminDao;
public List<BmAdmin> getBmAdminLoginName(String loginname) {
// TODO Auto-generated method stub
return bmAdminDao.getBmAdminLoginName(loginname);
}
controller层:
public class BmAdminAction extends ActionSupport {
private static final long serialVersionUID = 4297180770984426910L;
@Autowired
private BmAdminService bmAdminService;
private BmAdmin bmAdmin;
public BmAdmin getBmAdmin() {
return bmAdmin;
}
public void setBmAdmin(BmAdmin bmAdmin) {
this.bmAdmin = bmAdmin;
}
public String adminmess() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
String loginName = (String) session.getAttribute("loginname");
List<BmAdmin> list = bmAdminService.getBmAdminLoginName(loginName);
ActionContext ctx = ActionContext.getContext();
ctx.put("adminme", list);
return "admin";
}
}
vo层:
@Entity
@Table(name = "bm_admin")
public class BmAdmin implements Serializable {
private static final long serialVersionUID = 5938178566540780464L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "login_name", length = 100, nullable = false, unique = true)
private String loginName;
@Column(name = "password", length = 32, nullable = false)
private String password;
@Column(name = "name", length = 32, nullable = false, unique = true)
private String name;
@Column(name = "serialnumber", length = 32, nullable = false)
private String serialnumber;
@Column(name = "email", length = 32, nullable = false)
private String email;
@Column(name = "mobile", length = 32, nullable = false)
private String mobile;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSerialnumber() {
return serialnumber;
}
public void setSerialnumber(String serialnumber) {
this.serialnumber = serialnumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
@Override
public String toString() {
return "BmAdmin [id=" + id + ", loginName=" + loginName + ", password="
+ password + ", name=" + name + ", serialnumber="
+ serialnumber + ", email=" + email + ", mobile=" + mobile
+ "]";
}
}
SSM项目(spring+springMVC+mybatis)
@Component:通用注解;@Name:通用注解;@Repository:持久化层组件注解
@Service:业务层组件注解;@Controller:控制层组件注解
@Autowired注解标记也可以用在字段定义或setter方法定义前面,默认按类型匹配注入
@RequestMapping标明这个类或者方法与哪一个客户请求对应
@ResponseBody注解(在Spring MVC中,此注解与JSON响应相关)
@Transactional属性:可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
value | String | 可选的限定描述符,指定使用的事务管理器 |
propagation | enum: Propagation | 可选的事务传播行为设置 |
isolation | enum: Isolation | 可选的事务隔离级别设置 |
readOnly | boolean | 读写或只读事务,默认读写 |
timeout | int (in seconds granularity) | 事务超时时间设置 |
rollbackFor | Class对象数组,必须继承自Throwable | 导致事务回滚的异常类数组 |
rollbackForClassName | 类名数组,必须继承自Throwable | 导致事务回滚的异常类名字数组 |
noRollbackFor | Class对象数组,必须继承自Throwable | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 类名数组,必须继承自Throwable | 不会导致事务回滚的异常类名字数组 |
@Qualifier:Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Service注解的名称之一。
@resource注入时比较简单了注解自带了“name”的val就是@Service注解的名称之一
@RequestParam:Spring会自动将表单参数注入到方法参数(名称一致)
@ModelAttribute:当Controller组件处理后,需要向JSP传值用此方法
@ExceptionHandler注解提供了Spring MVC处理异常的方法
AOP切面编程通知:
spring aop的5种通知类型都有
Before前置通知
AfterReturning后置通知
Around环绕通知
AfterThrowing异常通知
After最终通知
@PathVariable作用是将URI请求模板中的变量解析出来,映射到处理方法的参数上
@RequestMapping(value = "/emp/{id}",method = requestMethod.GET)
public String execute(@PathVariable("id") int id){
//查询操作处理
return " ";
}
SpringMVC中对数据在传输过程中的result风格处理方式:
@RequestMapping(value="book",method=RequestMethod.POST) //添加
@RequestMapping(value="book",method=RequestMethod.DELETE)//删除
@ResponseBody
利用AJAX发送请求
@RequestMapping(value="book",method=RequestMethod.PUT).//修改
利用Ajax,在客户端发出PUT、DELETE动作的请求
在form请求中:
在web.xml配置过滤器:
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
<input type="hidden" name="_method" value="PUT"/>
<input type="hidden" name="_method" value="DELETE"/>
@RequestMapping(value="book",method=RequestMethod.GET)//查询
1、项目结构
2、配置文件:
applicationContext.xml
<!--扫描spring注解管理的类-->
<context:component-scan base-package="com.exp.service"/>
<!--加载数据库配置文件-->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 注册事务管理器 -->
<bean id="msg" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事务注解驱动 -->
<tx:annotation-driven transaction-manager="msg" />
<!-- 配置mybatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:com/exp/mapping/*.xml"/>
<property name="configLocation" value="classpath:spring-mybatis.xml"/>//这个配置文件只能配置别名、缓存等特性,不能在该配置文件扫描mapper.xml文件
</bean>
<!-- 配置可以整体扫描MapperDao的一个扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.exp.mapping"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
jdbc.properties:
driver =com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/login?useUnicode=true&characterEncoding=utf8
username=root
password=root
mybatis-config.xml:
<settings>
<!-- 是否开启自动驼峰命名规则create_time createTime,默认是false -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启延迟加载的总开关 -->
<setting name="lazyLoadingEnabled" value="true" />
<!--开启按需加载的开关 -->
<setting name="aggressiveLazyLoading" value="false" />
<!--开启二级缓存 -->
<!-- <setting name="cacheEnabled" value="true" /> -->
</settings>
<typeAliases>
<!-- 批量设置别名 -->
<package name="com.exp.vo" />
</typeAliases>
spring-mvc.xml:
<!-- 扫描controller -->
<context:component-scan base-package="com.exp.controller" />
<!--处理静态资源-->
<mvc:resources mapping="/*" location="/static/" />
<!-- 生成注解映射器和适配器 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- ViewResolver视图解析器,解析jsp视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 指定视图路径前缀 -->
<property name="prefix" value="/WEB-INF/jsp"/>
<!-- 指定视图路径后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
web.xml
<display-name>ssm</display-name>
<!--spring容器加载-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--字符过滤器-->
<filter>
<filter-name>encodeFilter</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>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--在创建serveContext时候加载spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--springMVC中央控制器配置-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--数据源监控-->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!--首页-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
controller层:
@Controller
public class loginController {
@RequestMapping("/")
public String loginPage() {
return "login";
}
}
service层:
@Override
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public void funttwosfer(int formUserId, int id, BigDecimal money) {
System.out.println("进入转账");
BigDecimal formmoney = fundao.getMoney(formUserId);
if (!(formmoney.compareTo(money) == -1)) {
// 转出账户减掉金额
fundao.subMoney(formUserId, money);
// int i = 10 / 0;// 测试异常
// 收到账户添加金额
fundao.addMoney(id, money);
}
System.out.println("结束转账");
}
dao层:
Mapper配置文件中的sql动态编写,可根据mybatis文档中的各种关键字一一对应实现:
测试类:
类注解:
@Test
public void demo1(){
UserBaseInfo userBaseInfo=userService.getUserBaseInfo(1);
System.out.println("我要输出内容了");
System.out.println(userBaseInfo.getUserName());
System.out.println("haha");
}
pom.xml相关信息:
modelVersion | Maven模块版本,目前我们一般都取值4.0.0 |
groupId | 整个系统的名称。 |
artifactId | 子模块名称。 |
packaging | 打包类型,可取值:jar,war等等,这个配置用于package的phase,具体可以参见package运行的时候启动的plugin,后面有机会我们会讲述如何配置打包的插件。 |
<modelVersion>4.0.0</modelVersion><!---->
<groupId>com.exp</groupId>
<artifactId>learn</artifactId>
<packaging>war</packaging><!--jar样式-->
<version>1.0-SNAPSHOT</version><!--项目版本控制-->
<name>learn Maven Webapp</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--编码格式-->
<spring.version>4.2.9.RELEASE</spring.version><!--springjar包版本-->
<jackson.version>2.5.0</jackson.version><!--json版本-->
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- mybatis 包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!--mybatis spring 插件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- mysql连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- json -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.8</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.0.5</version>
</dependency>
</dependencies>
<build>
<finalName>learn</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
通过将应用多模块拓展,水平扩展相应的组件,来满足当前的需求
Maven多模块项目
1、公共模块(编码过程中需要重复用到的工具,减少繁杂度)
2、数据处理模块(各种条件下的增删查改等,有利于服务层的重复利用)
3、服务层模块(具体逻辑的处理与编写,在一二的基础上更加得心应手)
4、控制层模块(用于数据处理以个性的方式与前台交互渲染)
SOA(面向服务的架构)-------》ESB架构(企业服务总线)
场景:更多的传统企业
提供多系统集成更廉价的解决方案
esb:
传统中间件技术与XML、Web服务等技术结合
soa:
将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来
嵌入式编程、约定大于配置、组件化开发、微服务开发、针对开发与业务为主、是web服务精简版
SpringBoot项目
搭建项目:new-->Project-->Spring Initralizr
pom文件:
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hm</groupId>
<artifactId>springbootdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springbootdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--引用thymeleaf模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--引入web相关jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--springboot测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入支持jsp的jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--log4j-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>unknown</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<!--打包插件-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.properties文件:(可用yml文件替换)
server.port=8080
#日志打印
logging.level.org.springframework=debug
logging.level.org.mybatis=debug
logging.level.org.apache.ibatis=debug
#数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:/localhost:3306/yhm?useUnicode=true&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
#SpringMVC相关页面解析器配置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
#mapper文件扫描
mybatis.mapper-locations=classpath*:com/hm/springbootdemo/dao/*.xml
mybatis.type-aliases=com.hm.springbootdemo.vo
dao层:
@Mapper
@Repository("userLoginValidate")
public interface UserLoginValidate {
public boolean login(@Param("account")String account,@Param("password") String password);
}
mapper配置文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hm.springbootdemo.dao.UserLoginValidate">
<select id="login" resultType="boolean">
select * from Uuser where user_name=#{userName} and user_password=#{userPassword}
</select>
</mapper>
service层:
public interface UserService {
public boolean login(String account, String password);
}
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserLoginValidate userLoginValidate;
@Override
public boolean login(String account, String password) {
boolean login = userLoginValidate.login(account, password);
if (login==true){
return true;
}
return false;
}
}
controller层:
@RequestMapping("/login")
public String requestMainPage(@Param("account")String account,@Param("passwoud") String password){
if (account!=null||password!=null){
boolean login = userService.login(account, password);
if(login==true){
return "main";
}
return "index";
}
return "index";
}
提供良好的开箱即用经验的典型用例和可扩展性机制覆盖。
springColud
场景:大型互联网企业
项目搭建:
填写包名--项目名--打包样式:
暂时不选择模板依赖:
注意项目名与项目所放路径
Springcolud微服务初始构架:
IDEAmaven设置地址:
maven的初始化文件:(项目开发可以自己另行添加)
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springcolud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcolud</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
设置项目需要隐藏的文件
创建子模块
可以将父级模块中的文件删除,留下pom文件作为父级通用依赖管理者
父级pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>spring-colud-ms-eureka</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springcolud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcolud</name>
<!--最后打包 最外层的pom 需要更改为 pom而不是jar-->
<packaging>pom</packaging>
<description>Demo project for Spring Colud</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>2.0.0.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--加入springcolud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
子级pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-colud-ms-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-colud-ms-eureka</name>
<packaging>jar</packaging>
<description>eureka for project</description>
<parent>
<groupId>com.example</groupId>
<artifactId>springcolud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在本地配置hosts文件
在启动器上加入服务注册注解
@EnableDiscoveryClient
@EnableDiscoveryServer
@EnableEurekaServer:对应的版本问题:(待学习)
springcolud子模块构架
application.properties文件
#声明本服务在注册中心展示的名字、也是在网关访问时定位服务的名字
spring.application.name=spring-cloud-ms-eureka
#在windows下的hosts文件中增加了 127.0.0.1 swapping1
eureka.instance.hostname=swapping1
server.port=8000
#是否将自己作为服务注册到注册中心,默认为true,false不能将自己注册到自己,
#如果有多个服务注册中心的微服务的话,可以将这个设置为true,表示可以将注册中心1注册到注册中心2中
eureka.client.register-with-eureka=false
#表示是否从eureka注册中心中获取注册信息,默认为true
eureka.client.fetch-registry=false
#注册中心的交互地址,设置多个地址可以用,分隔 查询服务和注册服务都需要依赖这个地址
#关于设置注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。
#在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案
#所以 在一个分布式系统中,设置最少两个服务注册中心是最基本的
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
注意每一个端口对应一个服务
单体架构
技术选型非常灵活,优先满足快速上线的要求
垂直架构
将系统分为不同的层级,每个层级有对应的职责
服务性架构
服务内部高内聚,服务之间低耦合
微服务架构
强调每个服务都有单独的运行空间