ssm整合练习

环境配置

  • springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--静态资源过滤-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>
    <!--全局包扫描,只扫描controller注解-->
    <context:component-scan base-package="com.javasm" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter>
    </context:component-scan>
    <!--全局跨域配置-->
    <!--<mvc:cors>-->
        <!--<mvc:mapping path="/**" allow-credentials="true" allowed-headers="*" allowed-methods="*" allowed-origins="*" exposed-headers="Set-Cookie"/>-->
    <!--</mvc:cors>-->

    <!--登录判断拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/admin/nameCharge"></mvc:exclude-mapping>
            <mvc:exclude-mapping path="/admin/login"></mvc:exclude-mapping>
            <bean class="com.javasm.common.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>
  • spring.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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--全局包扫描,排除controller注解-->
    <context:component-scan base-package="com.javasm">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
    </context:component-scan>

    <!--aop织入-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!--加载mybatis-spring的配置文件-->
    <import resource="classpath:mybatis-spring.xml"></import>
</beans>
  • mybatis-spring.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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--加载jdbc资源文件-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
    <!--配置数据源对象,使用druid连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.name}"></property>
        <property name="password" value="${jdbc.pass}"></property>
    </bean>

    <!--对mapper接口创建代理对象,加入容器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.javasm.*.mapper"></property>
    </bean>

    <!--创建全局的sqlsessionfactory对象(数据源,映射文件,别名、驼峰映射等其他配置)-->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="mapperLocations" value="classpath:com/javasm/*/mapper/*.xml"></property>
        <property name="configLocation" value="classpath:mybatis.xml"></property>
        <!--配置分页插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor" id="pageInterceptor">
                    <property name="properties">
                        <!--分页参数合理化-->
                        <value>reasonable=true</value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <!--配置spring的事务管理器对象(打开会话,提交会话,回滚,关闭)-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--通过事务通知,把事务管理器织入到带有@Transactional注解的方法-->
    <tx:annotation-driven></tx:annotation-driven>

</beans>
  • mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"></setting>
    </settings>

    <typeAliases>
        <package name="com.javasm"></package>
    </typeAliases>
</configuration>
  • jdbc.properties
jdbc.url = jdbc:mysql://127.0.0.1:3306/second_stage?characterEncoding=UTF8&useSSL=true
jdbc.name = root
jdbc.pass = root
jdbc.driver = com.mysql.jdbc.Driver
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--跨域拦截器的配置-->
    <filter>
        <filter-name>myCrosFilter</filter-name>
        <filter-class>com.javasm.common.filter.MyCrosFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myCrosFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--通过ContextLoaderListener监听器在tomcat启动时,加载spring.xml文件来初始化父容器对象-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>

    <!--通过DispatcherSerlvet在tomcat启动时,加载springmvc.xml文件来初始化子容器对象,-->
    <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:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--配置中文过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

commons公共包

entity实体类

  • StatusEnum
public enum StatusEnum {

    SUCCESS(20000,"操作成功"),
    ERROR(50000,"操作失败"),
    LOGIN_ERR(50001,"用户未登录"),
    MENU_ERR(50002,"菜单列表获取失败");

    private Integer code;
    private String msg;

    StatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
  • StatusBean
public class StatusBean {
    private Integer code;
    private String msg;

    public StatusBean(StatusEnum statusEnum) {
        this.code = statusEnum.getCode();
        this.msg = statusEnum.getMsg();
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}
  • ResponseBean
public class ResponseBean extends StatusBean {

    private Object data;

    public ResponseBean(StatusEnum statusEnum, Object data) {
        super(statusEnum);
        this.data = data;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

interceptor拦截器

  • LoginInterceptor登陆拦截
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        SysAdmin login_user = (SysAdmin) request.getSession().getAttribute("LOGIN_USER");
        if (login_user == null) {
            throw new MyException(StatusEnum.LOGIN_ERR);
//            System.out.println("执行了拦截器");
//            response.sendRedirect("http://127.0.0.1:8848/ssm/login.html");
//            return false;
        } else {
            return true;
        }
    }
}

filter过滤器

  • MyCrosFilter 全局跨域过滤配置
public class MyCrosFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;

            // 预检请求,请求头Origin是客户端地址,要求跨域头不能是*
            String origin = httpRequest.getHeader("Origin");
            if (origin == null) {
                httpResponse.addHeader("Access-Control-Allow-Origin", "*");
            } else {
                httpResponse.addHeader("Access-Control-Allow-Origin", origin);
            }
            httpResponse.addHeader("Access-Control-Allow-Headers",
                    "Origin, x-requested-with, Content-Type, Accept,X-Cookie,token");
//httpResponse.addHeader("Access-Control-Expose-Headers", "token");

            httpResponse.addHeader("Access-Control-Allow-Credentials", "true");
            httpResponse.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
            //预检请求,直接通过。
            if (httpRequest.getMethod().equals("OPTIONS")) {
                httpResponse.setStatus(HttpServletResponse.SC_OK);
                return;
            }
            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e;
        }
    }
    @Override
    public void destroy() {
    }
}

exception自定义异常

  • MyException
public class MyException extends RuntimeException {
    private StatusEnum statusEnum;

    public MyException(StatusEnum statusEnum) {
        this.statusEnum = statusEnum;
    }

    public StatusEnum getStatusEnum() {
        return statusEnum;
    }

    public void setStatusEnum(StatusEnum statusEnum) {
        this.statusEnum = statusEnum;
    }
}

advice 全局异常处理

  • ExceptionResolver
@Component
@ControllerAdvice
public class ExceptionResolver {
    @ExceptionHandler(MyException.class)
    public ResponseEntity doMyException(MyException e){
        return ResponseEntity.ok(new StatusBean(e.getStatusEnum()));
    }
}

module1模块(mybatis-generator逆向生成)

entity

handler(session、分页、增删改查)

  • SysAdminHandler(登录session)
@Controller
@RequestMapping("admin")
public class SysAdminHandler {

    @Autowired
    private SysAdminService adminService;

    @GetMapping("nameCharge")
    public ResponseEntity nameCharge(String nameCharge) {
        System.out.println(nameCharge);
        SysAdmin sysAdmin = adminService.selectAdminByName(nameCharge);
        if (sysAdmin == null) {
            throw new MyException(StatusEnum.ERROR);
        } else {
            sysAdmin.setApwd(""); // 设置密码为空
            return ResponseEntity.ok(new ResponseBean(StatusEnum.SUCCESS, sysAdmin));
        }
    }

    @GetMapping("login")
    public ResponseEntity loginCharge(String name, String pass, HttpServletRequest req) {
        System.out.println(name);
        System.out.println(pass);
        SysAdmin sysAdmin = adminService.selectAdminByNameAndPass(name,pass);
        if (sysAdmin == null) {
            throw new MyException(StatusEnum.ERROR);
        } else {
            HttpSession session = req.getSession();
            System.out.println(session);
            req.getSession().setAttribute("LOGIN_USER",sysAdmin); // 服务端保存会话信息
            System.out.println(req.getSession().getAttribute("LOGIN_USER"));
            return ResponseEntity.ok(new StatusBean(StatusEnum.SUCCESS));
        }
    }

}
  • SysMenuHandler(事务、分页、增删改查)
@Controller
@RequestMapping("menu")
public class SysMenuHandler {

    @Autowired
    private SysMenuService menuService;

    @GetMapping("getMenu")
    public ResponseEntity getMenu(HttpServletRequest req) {
        HttpSession session = req.getSession();
        System.out.println(session);

        SysAdmin loginUser = (SysAdmin) req.getSession().getAttribute("LOGIN_USER");
        if (loginUser == null) {
            throw new MyException(StatusEnum.LOGIN_ERR);
        }
        List<SysMenu> sysMenus = menuService.selectList(loginUser.getMenuId());
        if (sysMenus == null) {
            throw new MyException(StatusEnum.MENU_ERR);
        } else {
            loginUser.setApwd("");
            Map<String, Object> map = new HashMap<>();
            map.put("adminInfo", loginUser);
            map.put("menuInfo", sysMenus);
            return ResponseEntity.ok(new ResponseBean(StatusEnum.SUCCESS, map));
        }
    }

    @GetMapping("deleteMenu")
    public ResponseEntity deleteByPrimaryKey(Integer pid) {
        int result = menuService.deleteByPrimaryKey(pid);
        if (result >= 1) {
            return ResponseEntity.ok(new StatusBean(StatusEnum.SUCCESS));
        } else {
            throw new MyException(StatusEnum.ERROR);
        }
    }

    @PostMapping("updateMenu")
    public ResponseEntity updateMenu(@RequestBody SysMenu sysMenu) {
        System.out.println(sysMenu);
        int result = menuService.updateByPrimaryKeySelective(sysMenu);
        if (result >= 1) {
            return ResponseEntity.ok(new StatusBean(StatusEnum.SUCCESS));
        } else {
            throw new MyException(StatusEnum.ERROR);
        }
    }

    @PostMapping("selectMenu")
    public ResponseEntity selectMenu(@RequestBody Map<String, Object> map) throws InvocationTargetException, IllegalAccessException {
        SysMenu sysMenu = new SysMenu();
        // 菜单的条件查询项装载
        BeanUtils.populate(sysMenu, map);

        // 得到分页信息
        PageHelper.startPage((Integer) map.get("pageNum"), (Integer) map.get("pageSize"));// 1

        List<SysMenu> sysMenus = menuService.selectByInfo(sysMenu);

        // 把分页信息及数据装载进PageInfo对象
        PageInfo<SysMenu> sysMenuPageInfo = new PageInfo<SysMenu>(sysMenus); // 2

        if (sysMenus.size() != 0) {
            return ResponseEntity.ok(new ResponseBean(StatusEnum.SUCCESS, sysMenuPageInfo));
        } else {
            throw new MyException(StatusEnum.ERROR);
        }
    }

    @PostMapping("insertMenuAndAdmin")
    public ResponseEntity insertMenuAndAdmin(@RequestBody Map<String, Object> map) throws InvocationTargetException, IllegalAccessException {
        System.out.println(map);
        SysMenu sysMenu = new SysMenu();
        SysAdmin admin = new SysAdmin();
        BeanUtils.populate(sysMenu, map);
        BeanUtils.populate(admin, map);
        System.out.println(sysMenu);
        System.out.println(admin);

        int result = menuService.insertMenuAndAdmin(admin, sysMenu);
        if (result >= 1) {
            return ResponseEntity.ok(new StatusBean(StatusEnum.SUCCESS));
        } else {
            throw new MyException(StatusEnum.ERROR);
        }
    }
}

service部分截取(事务)

@Service
public class SysMenuServiceImpl implements SysMenuService {

    @Autowired
    private SysMenuMapper menuMapper;
    @Autowired
    private SysAdminMapper adminMapper;

    /**
     * 多表插入,事务注解
     *
     * @param admin
     * @param sysMenu
     * @return
     */
    @Override
    @Transactional
    public int insertMenuAndAdmin(SysAdmin admin, SysMenu sysMenu) {
        int result = 0;
        try {
            result = menuMapper.insertSelective(sysMenu);
            result = adminMapper.insert(admin);
        } catch (Exception e) {
            throw new MyException(StatusEnum.ERROR);
        }
        return result;
    }
}

mapper

前端axios-config.js全局配置

axios.defaults.baseURL = 'http://localhost:8080/0804/';
axios.defaults.withCredentials = true; //跨域配置

// //配置发送请求前的拦截器 可以设置token信息 
//    axios.interceptors.request.use(
//         config => {
//           return config
//        }, error => {
//           return Promise.reject(error)
//        }
//     )

// 配置响应拦截器 
axios.interceptors.response.use(
	res => {
		if(res.data.code == 50001){
			// 说明用户未登录
			location.href = "http://127.0.0.1:8848/ssm/login.html";
		}
		
		return Promise.resolve(res.data) // 这里直接返回data, 即接口返回的所有数据
	},
	error => {
		return Promise.reject(error);
	}
)

项目包结构及所需jar包

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值