• IDEA快速搭建WEB项目【记录篇】


    这里用的都是市面上通用的技术,而每个公司都有自己的调用方式,可以根据实际情况与业务场景不同去进行变通

     

    三层架构:

     界面层(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>
    &lt;!&ndash; <url>http://localhost:8080/manager</url> &ndash;&gt; &lt;!&ndash; tomcat6部署管理路径 &ndash;&gt;
    <url>http://localhost:8080/manager/text</url> &lt;!&ndash; tomcat7部署管理路径 &ndash;&gt;
    <username>admin</username> &lt;!&ndash; tomcat的管理员账号 &ndash;&gt;
    <password>admin</password>
    <port>8081</port>
    <path>/</path> &lt;!&ndash; 部署路径 &ndash;&gt;
    <charset>UTF-8</charset>
    <encoding>UTF-8</encoding>
    &lt;!&ndash; 运行redeploy命令前,要能正常访问http://localhost:8080/manager &ndash;&gt;
    </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文档中的各种关键字一一对应实现:

    测试类:

    类注解:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml"})
    具体测试
     
    @Resource
    private UserService userService;

    @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/

    注意每一个端口对应一个服务

    单体架构

    技术选型非常灵活,优先满足快速上线的要求

     垂直架构

    将系统分为不同的层级,每个层级有对应的职责

    服务性架构

    服务内部高内聚,服务之间低耦合

     

    微服务架构

    强调每个服务都有单独的运行空间

    学着把生活的苦酒当成饮料一样慢慢品尝, 不论生命经过多少委屈和艰辛, 我们总是以一个朝气蓬勃的面孔, 醒来在每一个早上。
  • 相关阅读:
    [ jquery 选择器 :not(selector) ] 此方法排除与selector选择器选取的页面元素
    [ jquery 选择器 :first ] 此方法获取指定jquery对象下的第一个元素
    [ jquery 方法 text([val|fn]) ] 此方法操作匹配的元素或元素集中的内容,相当于javascript中的innerText属性
    [ jquery 方法 html([val|fn]) ] 此方法操作匹配的元素或元素集中的内容,相当于javascript中的innerHTML
    [ jquery 方法val([val|fn|arr]) ] 此方法获得匹配元素的当前值,常应用于表单元素,select....
    [ jquery 方法 toggleClass(class|fn[,sw]) ] 此方法如果存在(不存在)就删除(添加)一个类
    [ jquery 方法 removeClass([class|fn]) ] 此方法为每个匹配的元素删除指定的类名
    [ jquery 方法 addClass(class|fn) ] 此方法为每个匹配的元素添加指定的类名
    C# SQL查询结果ToDataTable
    C#存储过程 传入参数 传出参数 结果集
  • 原文地址:https://www.cnblogs.com/yhm9/p/11424246.html
Copyright © 2020-2023  润新知