zoukankan      html  css  js  c++  java
  • 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;
        }
    }

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

    
    
  • 相关阅读:
    Arrays.fill方法的陷阱
    彻底弄懂最短路径问题
    《c++primer》疑惑记录
    C++ 隐含的this 指针
    c++ 内存分配
    抽象 与 封装 区别
    iconv 文件编码转换
    python中文分词工具——结巴分词
    词形变换和词干提取工具(英文)
    python 绘图工具 matplotlib 入门
  • 原文地址:https://www.cnblogs.com/kunpengv5/p/9918056.html
Copyright © 2011-2022 走看看