基于Restful 的前后端分离SSM框架的整合 (stuManagerSystem-ssm)

整合项目
stuManagerSystem-ssm

该项目与传统的SSM框架不同,采用了前后端分离技术。前端采用html 而不是传统的jsp, 采用axios来发请求,bootstrap框架来美化页面。后端整合了JWT做登录认证,将生成的Token 转换为cookie来实现免登录。

学习中新学的知识点 ——前端

  1. 1.1Axios是什么?用在什么场景?如何使用?

    1.2 axios不是在vue中可以用吗 以及如何使用
    1.3 小细节
  2. 经了解 axios是 是一个基于 promise 的 HTTP 库 那么 什么是 promise呢 ps:写的非常好 复习时记得看

3.中文版官方介绍一

中文版官方介绍二

Bugs:
1.编译时发生 Error:java: java.lang.ExceptionInInitializerError
在这里插入图片描述
经排查 是lombok版本问题(原先用的1.16.10和jdk10不兼容) 改成1.16.22即可 并记得把scope设置成 provided

2.Controller Service和Dao等都配置好了却访问不了
在这里插入图片描述
考虑到是spring注入的问题(注解和xml方式冲突) 于是把所有的@Resource改为@Autowired 和@Qualifier 并在spring-service.xml和spring-dao.xml里的注入都加进去还是没用。。
plus: 一些关于@Autowired和@Resource的细节问题1
@Autowired和@Resource的细节问题2
最后发现 是web.xml里配置DispatcherServlet的init-param配置错误:
原来写的是spring-mvc.xml,,分析后发现 因为原来那样配 相当于只配置了Controller 所以自然找不到Service Dao层的对象。。。
正确配置如下:
在这里插入图片描述
3. 在配置aop事务时 缺少aspectj.jar包 加入后还是报错 。。
后来发现因为是maven工程 虽然加入dependency但是jar包未真正加入到工程中
于是打开Project Structure 的Artifacts 中的WEB-INF中再次加入jar包

caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
	at java.lang.Class.getConstructor0(Unknown Source)
	at java.lang.Class.getDeclaredConstructor(Unknown Source)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1030)
	... 47 more
Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)

4.出这个错 纯属因为没网???
在这里插入图片描述
5.415错误 (Unsupported Media Type 服务器无法处理请求附带的媒体格式)
因为前端发过来是json格式但是后台无法接收
在SpringMVC配置文件中加段配置即可:(需要导下fastJson 依赖包)

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes" >
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <!-- 输出key时是否使用双引号 -->
                        <value>QuoteFieldNames</value>
                        <!-- 是否输出值为null的字段 -->
                        <!-- <value>WriteMapNullValue</value> -->
                        <!-- 数值字段如果为null,输出为0,而非null -->
                        <value>WriteNullNumberAsZero</value>
                        <!-- List字段如果为null,输出为[],而非null -->
                        <value>WriteNullListAsEmpty</value>
                        <!-- 字符类型字段如果为null,输出为"",而非null -->
                        <value>WriteNullStringAsEmpty</value>
                        <!-- Boolean字段如果为null,输出为false,而非null -->
                        <value>WriteNullBooleanAsFalse</value>
                        <!-- null String不输出  -->
                        <value>WriteNullStringAsEmpty</value>
                        <!-- null String也要输出  -->
                        <!-- <value>WriteMapNullValue</value> -->

                        <!-- Date的日期转换器 -->
                        <value>WriteDateUseDateFormat</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

但是修改之后 在PostMan还是400错误?

6.axios给后台发请求成功 但是前端出现404
因为没加@ResponseBody。。。
在这里插入图片描述
7.
解决跨域问题,前后端连调:Access to XMLHttpRequest at’http://localhost:

问题描述:在使用vue在载入页面时 希望能直接请求获取数据

<body onload="getData();background();">

出现的错误在这里插入图片描述
参考跨域问题解决方法
自己的解决方法1
既然是跨域问题 则将url改为一样即可
即 请求url
在这里插入图片描述
以及将axios请求的地址修改为一致
在这里插入图片描述
解决方法2:
如果不改axiosq请求的地址 前面还是http://127.0.0.1:8080
在这里插入图片描述
则要将 Contrller上加 @CrossOrigin注解在这里插入图片描述
8.org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'xx’的问题在这里插入图片描述
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘student_id’ in ‘class com.jay.entity.Student’

问题原因
mybatis会默认从String类中调用getXxx(如果传的id就会调用getId)方法,显然如果mybatis的StudentMapper.xml里的 关于insert的语句中没有这个属性的get方法 或者该属性(JavaBean)和数据库属性名不一致,就会报错。
解决方法一:配置parameterMap

解决方法二: 直接修改studentMapper.xml里的语句 将其修改为javabean对应的名字
在这里插入图片描述
9.删除操作时出现的的400错误 说是没给studentId这个参数 实际是axios的语法问题。。。
在这里插入图片描述
解决方法:将axios.post改为axios.delete 并且将studentId先在axios请求外面包装起来 再在请求中params:参数这样的形式发出去即可 浏览器会自动转换

在这里插入图片描述
总结:
以后要在前端做删除操作
1.先将请求设置为axios.delete
2.在axios请求外面把请求参数包装起来 再在请求中 {params:参数 } 这样的形式发出去即可 浏览器会自动转换

总结:

在写Contoller里的方法时 若是只需一个参数 如 findById 等 则需要使用 @Pathvarible ( 若不是restful 则用@requestParam) 如下

@ResponseBody
@GetMapping(value = "/findStudentById/{studentId}")
public Student findStudentById(@PathVariable("studentId") String studentId) {
    Student student = studentService.selectStudentById(studentId);
    System.out.println("student = " + student);
    return student;
}

在写Contoller里的方法时 若是表单数据提交(多数据)如 update insert 等 则需要使用 @RequestBody 如下

	  @ResponseBody
    @PostMapping("/insertStudent")
    public VResponse<Object> insertStudent(@RequestBody Student student) {
        studentService.insertStudent(student);
        return VResponse.success("添加成功");
    }

发布了53 篇原创文章 · 获赞 18 · 访问量 1748

猜你喜欢

转载自blog.csdn.net/c22cxz/article/details/104102729