二、SpringMVC接收参数

使用传统request对象接收参数

  • index.jsp地址栏传递参数
<a href="${pageContext.request.contextPath}/first?id=1">demo</a>
  • MyController
@Controller
public class MyController {
    @RequestMapping("/first")
    public String myform(HttpServletRequest request){
        String id = request.getParameter("id");
        //System.out.println(id);
        return "/second.jsp";
    }
}

不使用request接收简单类型参数

开发模式

  • 当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定
  • index.jsp
<a href="${pageContext.request.contextPath}/first?id=1&name=itlike">demo</a>
  • MyController
@Controller
public class MyController {
    /*使用参数代替配置,必须保持名称一致*/
    @RequestMapping("/first")
    /*这里变了*/
    public String myform(Integer id,String name){
        System.out.println(id);
        System.out.println(name);
        return "/second.jsp";
    }
}

其他属性(别名、是否必须、默认值)

  • @RequestParam
@Controller
public class MyController {
    /**
     * 如果参数名称不一致,就需要
     * 添加前缀:@RequestParam(value = "")
     * required属性:
     *      设置该参数是否必须(true时没有该发送参数,会报错)
     */
    @RequestMapping("/first")
    public String myform(@RequestParam(value = "id",required = false,defaultValue = "100") Integer idValue, String name){
        System.out.println(idValue);
        System.out.println(name);
        return "/second.jsp";
    }
}

要注意的是, 当required =true, 且设置默认值, 不会报错!

  • 表单接收参数
<form action="${pageContext.request.contextPath}/myform">
    user:<input type="text" name="user_name"><br>
    age: <input type="text" name="user_age"><br>
    <input type="submit" value="提交">
</form>
@Controller
public class MyController {
    @RequestMapping("/myform")
    public String show(String user_name,String user_age) {
        System.out.println(user_name);
        System.out.println(user_age);
        return "/second.jsp";
    }
}

JavaBean接收参数

要求对象当中的属性要和表单当中的名称一致

@Getter@Setter
public class User {
    private String user_name;
    private String user_age;
    @Override
    public String toString() {
        return "User{" +
                "user_name='" + user_name + '\'' +
                ", user_age='" + user_age + '\'' +
                '}';
    }
}
@Controller
public class MyController {
    @RequestMapping("/myform")
    public String show(User user) {
        System.out.println(user);
        return "/second.jsp";
    }
}

数组接收数据

name相同时,中以使用数组来接收对应的参数

<form action="${pageContext.request.contextPath}/myform">
    name1:<input type="text" name="name"><br>
    name2: <input type="text" name="name"><br>
    <input type="submit" value="提交">
</form>
@Controller
public class MyController {
    @RequestMapping("/myform")
    public String show(String[] name) {
        System.out.println(Arrays.toString(name));
        return "/second.jsp";
    }
}
// [111, 222]

使用数组改造JavaBean接收参数

  • 假设有爱好选项
@Getter@Setter
public class User {
    private String user_name;
    private String user_age;
    private String[] hobby;
    @Override
    public String toString() {
        return "User{" +
                "user_name='" + user_name + '\'' +
                ", user_age='" + user_age + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
}
<form action="${pageContext.request.contextPath}/myform">
    name1:<input type="text" name="user_name"><br>
    name2: <input type="text" name="user_age"><br>
    hobby: <input type="checkbox" name="hobby" value="篮球">篮球
    <input type="checkbox" name="hobby" value="足球">足球
    <input type="checkbox" name="hobby" value="羽毛球">羽毛球 <br>
    <input type="submit" value="提交">
</form>
@Controller
public class MyController {
    @RequestMapping("/myform")
    public String show(User user) {
        System.out.println(user);
        return "/second.jsp";
    }
}
// User{user_name='itlike', user_age='111', hobby=[篮球, 羽毛球]}

包装类接收参数

使用对象.属性

  • index.jsp
<form action="${pageContext.request.contextPath}/myform">
    name:<input type="text" name="user_name"><br>
    age: <input type="text" name="user_age"><br>
    -----------宠物-----------<br>    
    宠物名称:<input type="text" name="dog.name"><br>
    宠物颜色:<input type="text" name="dog.color"><br>
    <input type="submit" value="提交">
</form>
  • User
@Getter@Setter
public class User {
    private String user_name;
    private String user_age;
    private Dog dog;
    @Override
    public String toString() {
        return "User{" +
                "user_name='" + user_name + '\'' +
                ", user_age='" + user_age + '\'' +
                ", dog=" + dog +
                '}';
    }
}
  • Dog
@Getter@Setter
public class Dog {
    private String name;
    private String color;
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}
  • MyController
@Controller
public class MyController {
    @RequestMapping("/myform")
    public String show(User user) {
        System.out.println(user);
        return "/second.jsp";
    }
}

List集合接收参数

  • index.jsp
<form action="${pageContext.request.contextPath}/myform">
    name1:<input type="text" name="user_name"><br>
    name2: <input type="text" name="user_age"><br>
    -----------宠物1-----------<br>
    宠物名称:<input type="text" name="dogs[0].name"><br>
    宠物颜色:<input type="text" name="dogs[0].color"><br>
    -----------宠物2-----------<br>
    宠物名称:<input type="text" name="dogs[1].name"><br>
    宠物颜色:<input type="text" name="dogs[1].color"><br>
    -----------我是华丽的分割线-----------<br>
    <input type="submit" value="提交">
</form>
  • User
@Getter@Setter
public class User {
    private String user_name;
    private String user_age;
    private List<Dog> dogs;
    @Override
    public String toString() {
        return "User{" +
                "user_name='" + user_name + '\'' +
                ", user_age='" + user_age + '\'' +
                ", dogs=" + dogs +
                '}';
    }
}
  • MyController
@Controller
public class MyController {
    @RequestMapping("/myform")
    public String show(User user) {
        System.out.println(user);
        return "/second.jsp";
    }
}

类型转换器

表单发送String类型

<form action="${pageContext.request.contextPath}/convert">
    年龄:<input type="text" name="age">
    <input type="submit" value="提交">
</form>

SpringMVC转为Integer类型

@Controller
public class MyController {
    @RequestMapping("/convert")
    public ModelAndView show(Integer age) {
        ModelAndView modelAndView = new ModelAndView();
        /**
         * 表单接收的String => Integer
         */
        System.out.println(age);       
        modelAndView.setViewName("/second.jsp");
        return modelAndView;
    }
}

日期格式转换引发的错误

SpringMVC内部支持的日期格式是2020/10/21而不能是2020-10-21

  • index.jsp
<form action="${pageContext.request.contextPath}/convert">
    年龄:<input type="text" name="age">
    <input type="text" name="date"><br>
    <input type="submit" value="提交">
</form>
  • MyController
@Controller
public class MyController {
    @RequestMapping("/convert")
    public ModelAndView show(Integer age, Date date) {
        ModelAndView modelAndView = new ModelAndView();
        /**
         * 使用Date类型接收表单发送的日期数据
         */
        System.out.println(age);
        System.out.println(date);
        modelAndView.setViewName("/second.jsp");
        return modelAndView;
    }
}
  • 测试案例一:2020-10-21
    11861407-61638bc0b1ed7e17.PNG
    1.PNG

    11861407-48455998110ab46f.PNG
    2.PNG
  • 测试案例二:2020/10/21
    11861407-bf397fdec5ac87c4.PNG
    3.PNG

    11861407-5bca831e4ba1ddb1.PNG
    4.PNG

自定义Converter类型转换器

解决上述的日期格式问题

  • 定义转换器
public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        if(source != null){
            /**
             *  yyyy-MM-dd 指定可以转换的日期格式为 2020-10-21
             *  有个问题要说一下,一旦使用了该类,则原来的格式不再可用!
             *  2020/10/21 报错!(根据需求选择哪种日期方式)
             */
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return simpleDateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
  • 注入springmvc
<!--配置日期转换器-->
<bean id="dateConverter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.itlike.web.converter.DateConverter" />
        </list>
    </property>
</bean>
<!--注解驱动开发-->
<mvc:annotation-driven conversion-service="dateConverter"/>

重新启动服务器,运行即可!(要注意,原来的2020/10/21格式将不再支持!)

日期输出格式化

// date是页面传值
new SimpleDateFormat("yyyy-MM-dd").format(date);

解决post请求中文乱码

springmvc使用GET请求发送中文不会乱码,而同样的代码,一旦使用POST请求发送就会中文乱码!

  • 解决方案:使用springmvc的过滤器
<!-- 解决post乱码问题 -->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 设置编码参是UTF8 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

猜你喜欢

转载自blog.csdn.net/weixin_33766168/article/details/87777821