SpringMVCDemo中,遇到的问题(一)
近两日学习SpringMVC框架时,编写了一个查询的小demo。
功能介绍:根据name及producing_area查询结果。若为空时,查询出所有结果。
1、启动项目后,页面404。
debug代码后,发现return时,页面找不到。
解决:由于spring的配置文件中没有配置视图解析器,默认的视图解析器与使用方式不匹配。在spring配置文件中配置。
InternalResourceViewResolver,视图解析器。下面的配置实现了,当一个被请求的Controller处理方法返回一个名为“login”的视图时
InternalResourceViewResolver会将“login”解析成一个InternalResourceView的对象,然后将返回的model模型属性信息,存放到对应
的HttpServletRequest属性中,最后利用RequestDispatcher在服务器端,把请求forward到“/WEB-INF/login.jsp”上。
1 @RequestMapping(value = "queryFruitsByCondition") 2 public String queryFruitsByCondition(Model model, Fruits fruits) { 3 List<Fruits> fruitsList = null; 4 if (fruits == null || 5 (StringUtils.isBlank(fruits.getName()) && StringUtils.isBlank 6 (fruits.getProducing_area()))) { 7 fruitsList = fruitService.queryFruitsList(); 8 } else { 9 fruitsList = fruitService.queryFruitByCondition(fruits); 10 } 11 12 model.addAttribute("fruitsList", fruitsList); 13 return "/findFruits"; 14 }
2、启动后页面可以显示全部的结果了,但输入查询条件,点击查询后,依旧页面404。
debug后,发现上面代码中,若首次打开,fruits传参为空,会走4-7行的逻辑,若不为空,会走8-9行的逻辑。
输入查询条件,点击查询后,走的是后面的逻辑。queryFruitByCondition()方法也没问题。最后发现是jsp页面中,form表单绑定的action有问题。
前面不应该加根目录/,会导致访问不到。
3、查询条件,判空处理。输入空格也能查询,只不过匹配不到结果的情况。
起初4-6行,判断是否为空的条件语句是这么写的
if (fruits == null || (fruits.getName()==null && fruits.getProducing_area()==null))
发现会漏掉 ""," "的情况。
解决方式:
StringUtils.isBlank(),引自maven库如下地址
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
看一下源码,传进来的CharSequence(String是java中的字符串,继承自CharSequence),判断是否为null,且长度是否为0
并且,isWhitespace() 方法用于判断指定字符是否为空白字符,空白符包含:空格、tab键、换行符。
这样就能避免提到的漏过的情况。
4、查询条件,输入为中文,仍然查询不到。==||
再次debug发现,输入的查询条件到达controller后显示成了乱码。
解决办法:果断加过滤器,设置编码格式。
首先在web.xml中添加filter
1 <filter> 2 <filter-name>Encoding</filter-name> 3 <filter-class>com.kunpeng.mvc.utils.EncodingFilter</filter-class> 4 <init-param> 5 <param-name>ENCODING</param-name> 6 <param-value>UTF-8</param-value> 7 </init-param> 8 </filter> 9 10 <!--配置过滤器的执行--> 11 <filter-mapping> 12 <filter-name>Encoding</filter-name> 13 <url-pattern>/*</url-pattern> 14 </filter-mapping>
将所有请求转移到EncodingFilter中,EncodingFilter代码如下:
import javax.servlet.*; import java.io.IOException; /** * @author dukunpeng * @date 2018/8/19 15:04 */ public class EncodingFilter implements Filter { // 默认值 private String encoding = "UTF-8"; @Override public void init(FilterConfig filterConfig) throws ServletException { if(filterConfig.getInitParameter("ENCODING")!=null){ encoding = filterConfig.getInitParameter("ENCODING"); } } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding(encoding); servletResponse.setCharacterEncoding(encoding); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { encoding = null; } }
至此,终于可以正常查询啦。