首页 > 程序开发 > 软件开发 > Java >

SSM框架搭建web服务器实现登录功能(Spring+SpringMVC+Mybatis)

2016-08-15

初学java EE,虽然知道使用框架会使开发更加便捷高效,但是对于初学者来说,感到使用框架比较迷惑,尤其是各种jar包的引用、各种框架的配置、注解的使用等等。

初学java EE,虽然知道使用框架会使开发更加便捷高效,但是对于初学者来说,感到使用框架比较迷惑,尤其是各种jar包的引用、各种框架的配置、注解的使用等等。

最好的学习方法就是实践,于是下载了一个现成的DEMO,通过简单的修改先成功在自己电脑上跑起来,然后再逐个文件进行分析学习,最终才能从总体的高度上掌握框架的运行机制和配置方法,这样才能在实际运用中灵活配置,不会再局限于示例框架中。


SSM框架搭建流程

SSM框架Web程序的流程

上面链接总结的流程很好,但是该流程没有加入DAO这一层,经过分析本项目源码,流程应该是这样的:

database–>Entity.java–>mapper.xml–>Mapper.java–>Dao.java–>DaoImpl.java–>Service.java–>ServiceImpl.java–>Controller.java–>login.jsp

根据需要建立数据库、数据表、字段; 根据表中字段建立实体类; 在Mapper中实现对数据库的增删改查操作; 设计DAO(data access object)数据操作对象接口; 设计Service,通过DAO获取对象,然后进行业务逻辑实现; 设计控制层Controller,用于从页面获取请求,调用Service处理并将处理结果返回给页面。

根据上面所列,下面就按照这个流程进行设计。


使用MySQL数据库:

建立数据库 DB_TEST
CREATE DATABASE DB_TEST;
CREATE TABLE T_USER (
    ID INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
    USERNAME VARCHAR(16) NOT NULL,
    PASSWORD VARCHAR(16) NOT NULL
    );

INSERT INTO T_USER (USERNAME,PASSWORD) VALUES ("admin","123");


建立USER实体类

public class User {

   private int id;
   private String username;
   private String password;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}


Mapper实现增删改查


UserMapper接口,定义通过用户名获取用户对象的方法
public interface UserMapper {

    public User getUserByName(String username);
}


usermapper.xml,用于操作数据库,实现接口中的方法
  

    
        
        
                
    

    


DAO 数据操作对象


DAO接口 UserDao.java
public interface UserDao {
    //接口方法,通过用户名得到User对象
    public User findUserByName(String username);
}


DAO接口实现 UserDaoImpl.java

@Repository对应数据访问层Bean

@Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

当Service需要使用Spring创建的名为“userDao”的UserDaoImpl实例时, 就可以使用@Resource(name =”userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。

@Repository("userDao")
public class UserDaoImpl implements UserDao {
    //注解引用Mapper类资源
    @Resource(name = "userMapper")
    private UserMapper userMapper;

    /* 根据用户名查找用户对象 */
    public User findUserByName(String username) {
        //调用Mapper类从数据库中得到User对象
        return userMapper.getUserByName(username);
    }
}


业务层 Service


业务层接口 UserService.java
public interface UserService {
    // 通过用户名及密码核查用户登录
    public User checkLogin(String username, String password);
}


业务层接口实现类 UserServiceImpl.java

@Service对应的是业务层Bean

这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的”userService”注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的”userService”即可

@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;

    /* 登陆验证 */
    public User checkLogin(String username, String password) {
        //根据用户名实例化用户对象
        User user = userDao.findUserByName(username);
        if (user != null && user.getPassword().equals(password)) {
            return user;
        }
        return null;
    }
}


控制层 Controller


@Controller对应表现层的Bean,也就是Action

注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=”UserAction”)】或者【@Controller(“UserAction”)】,则使用value作为bean的名字。


@Scope(“prototype”)表示将Action的范围声明为原型

可以利用容器的scope=”prototype”来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。

spring 默认scope 是单例模式(scope=”singleton”),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全。

struts2 是要求每次次访问都对应不同的Action,scope=”prototype” 可以保证当有请求的时候都创建一个Action对象


@RequestMapping(“/user”)

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。


本项目中,该Controller类RequestMapping(”user”) 该Controller类的login方法RequestMapping(”login”) 所以登录页面中用户登录的 action=”/ssm/user/login”


@Controller
@Scope(value="prototype")
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @RequestMapping(value="/login",method=RequestMethod.POST)
    public String login(User user,Model model) throws Exception {
        user=userService.checkLogin(user.getUsername(), user.getPassword());
        if(user!=null){
            model.addAttribute(user);
            return "welcome";// 路径 WEB-INF/pages/welcome.jsp            
        }
        return "fail";
    }
}


页面 JSP





DEMO工程中的所有配置文件


applicationContext.xml

这个文件是Spring公共配置文件,下面分块进行解析。

数据库配置文件database.properties的引入
    
        
            
                          
            classpath:database.properties
            
        
    


数据库连接池的配置

数据库连接池可以让服务器预先与数据库建立部分连接,存入内存中,以减少连接数据库的耗时操作。 此处定义使用C3P0连接池的数据源。

    

        
        
            ${mysql.driver_class}
        

        
        
            ${mysql.connection.url}
        

        
        
            ${mysql.connection.username}
        

        
        
            ${mysql.connection.password}
        

        
        
            30
        

        
        
            2
        

        
        
            2
        

        
        
            10
        
    


自动扫描配置

使用< context:component-scan>标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean

    
        
        
    


集成Mybatis

SqlSessionFactoryBean是一个工厂bean,它的作用就是解析配置(数据源、别名等)。

    

        
        

        
        

        
        
            
                classpath:com/crm/mapper/*.xml
            
        
    


Mapper扫描配置

dao需要配置,如果数量大不适合一个个配置,需要使用mapper自动扫描来批量进行配置。

    
        
    


Mybatis事务管理配置
    
        
    


数据库配置文件database.properties

mysql.driver_class=com.mysql.jdbc.Driver

mysql.connection.url=jdbc:mysql://localhost:3306/DB_TEST

mysql.connection.username=root
mysql.connection.password=root


日志管理文件 log4j.properties

此处省略,入门阶段暂不考虑这么高端的日志用法。


Mybatis配置文件

通过使用别名,可以缩短类名的长度,但是只能在配置文件中使用。


    
    
        
    


web配置文件

此配置文件注释比较清楚,就不单独解析了。

    crm

    
    
           webAppRootKey
           crm.root
     

    
    
           log4jConfigLocation
           classpath:log4j.properties
    

    
    
           log4jRefreshInterval
           60000
    

    
     
        org.springframework.web.util.Log4jConfigListener 
     

    
    
        contextConfigLocation
        classpath*:springContext/*Context.xml
    

    
    
        org.springframework.web.context.ContextLoaderListener
    

    
      
        
            org.springframework.web.util.IntrospectorCleanupListener
        
      

    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            /WEB-INF/springmvc.xml
        
        
        1
    

    
    
        springmvc
        /
    

    
    
        characterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
    

    
        characterEncodingFilter
        /*
    

    
    
        login.jsp
    


springmvc配置文件

之前扫描专门忽略了Controller,在此处扫描。

例如在Controller类中常有类似return welcome这样的语句

其实完整的应该是return WEB-INF/pages/welcome.jsp

    
    

    
       
      
        

    
    

    

    
    
        
        
    


至此基本内容已经全部完了,项目可以轻松跑起来了。

但是在学习过程中,发现这些框架真的是太强大了,不知道什么时候才能掌握更多,目前仅仅是会用最基本的皮毛而已。

相关文章
最新文章
热点推荐