做imooc仿大众点评遇到的坑总结以及知识点记录
1.Q:在控制器中由一个requestmapping跳转到另一个功能为访问主页的requestmapping,虽然跳转成功,但是没有跳到主页上去。打印了log确实是已经成功走到了该requestmapping。
A:我去。。。是浏览器的问题,我在eclipse自带浏览器,chrom,firefox上实验,firefox是正常的,其他都有问题。
2.Q:restful风格上传图片提示method.post not support ❤❤❤
解决过程,首先定位问题点。肯定是配置的问题,与问题相关的有两个配置MultipartFilter(解析文件的)和hiddenHttpMethodFilter(转化http动作的)
按顺序先看MultipartFilter有没有正确的解析
进入MultipartFilter的源码,找filter的dofilter方法,往下跟,发现是lookupMultipartResolver方法返回的值有问题。
里面有一个if语句判断返回的是MultipartResolver类型还是defaultMultipartResolver。
试了一下替换里面返回defaultMultipartResolver的语句也返回MultipartResolver。发现成功解决问题。
但是改源码肯定是不行,定位问题后,发现是判断条件不通过,导致返回的是defaultMultipartResolver。
在条件语句中打断点,查看哪个值有异常。
后来发现是获取WebApplicationContext为空,导致不通过。
继续追踪代码发现ServletContext会从org.springframework.web.context.WebApplicationContext.ROOT中取值。这个东西不太了解,就去网上搜了一下资料。这个应该是spring的上下文,需要在web.xml中加入监听器。(该监听器,默认读取/WEB-INF/下的applicationContext.xml文件。但是通过context-param指定配置文件路径后,便会去你指定的路径下读取对应的配置文件,并进行初始化。)
具体的请看这文章,《ServletContext和WebApplicationContext的关系》
http://www.it165.net/pro/html/201502/33644.html
在web.xml添加一个监听器listen
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
在该路径spring/root-context.xml添加
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上传文件的总大小不能超过20M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="20000000"/>
<property name="defaultEncoding" value="utf-8"></property>
</bean>
1.SpringMVC的配置文件中加入
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上传文件的总大小不能超过20M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="20000000"/>
<property name="defaultEncoding" value="utf-8"></property>
</bean>
2.jsp中加入enctype="multipart/form-data"
<form id="mainForm" method="post" action="${basePath}/ad/modify" enctype="multipart/form-data">
3.后端用MultipartFile.getImgFile().transferTo(filepath); spring提供的方法
5. Q:如何解决大数量的订单数量查询,让其又快有节约性能
1.可以在数据库中新建一个表,记录最后一次更新时间。以及数量,在订单表增加一个创建时间的表。查询的时候查询时间大于最后一次更新时间的单数加上之前的单数,为总单数。
6. Q:添加了一个login.jsp让index开始就跳转到这个jsp,一直报错“The requested resource is not available.”
1.应该加一个controller,跳转到自己相应文件夹下面的jsp文件,springMVC的内容
@Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping
public String init(){
return "/system/login";
}
}
7.Q:做ssm框架数据库操作的代码,发现报错了。Could not autowire field: private org.imooc.service.UserService org.imooc.controller.system.LoginController.userservice
原因是继承service层的代码没有加@Service注解
并且在配置中加入扫描包的配置
<!-- 扫描service包 -->
<context:component-scan base-package="org.imooc.service" />
8.Q: A query was run and no Result Maps were found for the Mapped Statement
记录sql语句的xml没加resultType
9.Q:想向重定向的网址传递参数的方案?
使用RedirectAttributes 类的方法。
@RequestMapping("/validate")
public String validate(UserDto userDto, RedirectAttributesattr) {
attr.addFlashAttribute(PageCodeEnum.KEY, PageCodeEnum.LOGIN_FAIL);
return "redirect:/login";
}
10:Q用户可以手动输入地址跳过login界面直接进入后台。如何解决
在session中加入用户登陆信息,其他页面在中转时校验用户信息
11:Q加入表格该用什么开源插件
插件很多,有echarts
12:Q拦截器怎么配置的?
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /> //需要拦截的网址
<mvc:exclude-mapping path="/login/**" />//不需要拦截的网址
<mvc:exclude-mapping path="/css/**" />
<mvc:exclude-mapping path="/js/**" />
<mvc:exclude-mapping path="/images/**" />
<mvc:exclude-mapping path="/api/**" />
<bean class="org.imooc.controller.interceptor.SessionInterceptor"></bean>//代码所在
</mvc:interceptor>
</mvc:interceptors>
springMVC工作流程