先了解Spring MVC架构,总分总
基于Servlet的MVC模式:
Spring MVC工作流程:
SpringMVC
两种创建SpringMVC工程的方法
- Maven工程上add framework support:这个方法试了一下,很难完成,后面有机会再弄,推荐下面一种。
- SpringMVC工程上导入jar包:SpringMVC
参考教程
找到了一个教程,学习Spring MVC:http://c.biancheng.net/view/4399.html
问题记录
Spring MVC 几种接收参数方式
通过@ModelAttribute接收请求参数,没有办法直接使用user定义的属性名称
通过@PathVariable接收url中的请求参数,请求404(忽略大大的波浪线)
请求地址:http://localhost:80/SpringMVCHello_war_exploded/paramPathVariable/XiXi/123
结合界面,验证获取参数
在jsp代码中,教程给出的是核心代码,css、HTML、image都没有给出,所以这边一直运行不出来,可以等前端知识学习了,回头再看看
重定向与转发理解
return "forward:/index/isLogin" //转发到isLogin方法
return "redirect:/index/isLogin" //重定向到isLogin方法
转发是服务端的行为[用户无感知],重定向是客户端的行为[用户可见,响应码302]
下面的例子表现出来,重定向/index/login -->/index/isLogin、转发/index/login,两者最终转发到视图"main"
两者的区别:(1)request存放的信息,转发不会失效、重定向会失效;(2)转发的路径必须是同一个 Web 容器下的 URL,其不能转向到其他的 Web 路径上,中间传递的是自己的容器内的 request,重定向因为request信息的清除,所以可以定向到任意url。
所以这边的Web容器具体指的是啥?
@Autowired与@Service
@ModelAttribute 教程中太笼统了,且脚本不是很准确 找了一个详细版的:https://www.cnblogs.com/jasonZh/p/8761432.html
参考之后转变成自己现在正在设计的业务思路:
(1)@ModelAttribute与执行的方法写在一起
(2)写一个BaseController,所有需要控制权限的类继承。同样的可以将验证权限的方法写成BaseController,UserController继承该类,但我们之前继承之后,所有的方法之前之前需要验证该权限,对于注册来说,验证有没有登陆显然是没有必要的,可以将其拆成两个Controller。
类型转换:Formatter 与 Converter<S,T> 一样,也是一个可以将一种数据类型转换成另一种数据类型的接口。不同的是,Formatter 的源数据类型必须是 String 类型,而 Converter<S,T> 的源数据类型是任意数据类型。
Converter<S,T>:输入类型与参数类型不匹配,报错400,后面会有办法解决—输入校验
Converter<S,T>:自定义类型转换–补一下调用GoodsConverter逻辑
Formatter:配置有点不对,网上找了一个
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="com.springmvc.book.convert.MyFormatter"></bean>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
页面中文乱码问题
解决:jsp文件设置规范
Formatter的Locale类型的参数自定义问题,比如:2020-06-28
非Maven项目管理:手动导入jstl相关jar包,userList.jsp狂飘红,但不影响正常使用
导入jar包参考:https://blog.csdn.net/qq_39445165/article/details/84107885
JSON数据交互,前端代码没有调通。没有找到源程序,之后学了js等前端技术再补。–待解决
导入json相关jar包
拦截器两种实现方式
- 一种是通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;
- 另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。
多个拦截器的执行流程:在 Web 应用中通常需要有多个拦截器同时工作,这时它们的 preHandle 方法将按照配置文件中拦截器的配置顺序执行,而它们的 postHandle 方法和 afterCompletion 方法则按照配置顺序的反序执行。
数据验证
数据验证分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,通过 JavaScript 代码完成。服务器端验证是整个应用阻止非法数据的最后防线,通过在应用中编程实现。
从测试角度看及输入参数边界值、参数类型的有效验证。
客户端验证暂时不管,我们先看看服务端验证:
- 利用 Spring 自带的验证框架。
- 利用 JSR 303 实现。
在 Spring MVC 框架中先进行数据类型转换,再进行服务器端验证。
实现 org.springframework.validation.Validator 接口,达到接口验证的目的,遇到了问题
问题1:
解决:
问题2:运行Tomcat报错
解决:
参考文章:https://blog.csdn.net/weixin_42634260/article/details/89931226
问题3:SpringMVC去处理数据验证一直不成功,实现Validator 接口卡在读取错误信息配置上,注解卡在jar包导入。。。。–待解决
文件上传:上传之后的文件去哪儿了?
文件下载:文件名是中文,下载报错
further occurrences of HTTP header parsing errors...;
Invalid character found in the request target
参考文章:https://blog.csdn.net/a1104004650/article/details/83651159