SpringMVCDemo中,遇到的问题(一)

近两日学习SpringMVC框架时,编写了一个查询的小demo。

功能介绍:根据name及producing_area查询结果。若为空时,查询出所有结果。

SpringMVCDemo中,遇到的问题(一)

1、启动项目后,页面404。

debug代码后,发现return时,页面找不到。

解决:由于spring的配置文件中没有配置视图解析器,默认的视图解析器与使用方式不匹配。在spring配置文件中配置。

SpringMVCDemo中,遇到的问题(一)

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有问题。

前面不应该加根目录/,会导致访问不到。

SpringMVCDemo中,遇到的问题(一)

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键、换行符。
这样就能避免提到的漏过的情况。

SpringMVCDemo中,遇到的问题(一)

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;
    }
}

至此,终于可以正常查询啦。