自我复习springmvc(2)

Springmvc

绑定请求参数
用户发送的请求URL上带有参数时,spring MVC会自动将URL的参数值注入到控制器中映射方法的同名参数中,即要求方法形参名必须与请求参数名相同

​ 用户请求中的参数传递是以键值对的方式进行传递,spring MVC获取请求后,使用key取得请求的参数的value值并注入到方法的同名形参中(根据名称注入,与参数位置无关)。

​ 虽然请求中传递的参数都是字符串,但spring MVC底层会自动对其进行转换,以符合形参的类型进行注入(前提是可以进行转换)。

例:方法形参是Integer类型的,此时请求参数中的“123”就可以注入成功,而“ab”则不行,原因是ab无法转换成数字,又或是“12.34”,也不能注入,因为转换后是Double类型,无法注入到Integer类型参数中。

​ 需要注意的是:如果请求中传递的是整形数值字符串,方法形参采用Double类型,是可以进行注入的。也就是说,绑定请求参数时还得注意java数据类型转换的问题。

案例:
需求:获取用户请求中的参数,将其封装到控制器方法的形参中。
步骤1:修改index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<form method="post" th:action="@{/register}">
    <table>
        <tr>
            <td>用户名</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td>年龄</td>
            <td><input type="text" name="age"></td>
        </tr>
        <tr>
            <td>生日</td>
            <td><input type="text" name="birthday"></td>
        </tr>
        <tr>
            <td>爱好</td>
            <td>
                <input type="checkbox" name="hobbies" value="电视">电视
                <input type="checkbox" name="hobbies" value="游戏">游戏
                <input type="checkbox" name="hobbies" value="睡觉">睡觉
                <input type="checkbox" name="hobbies" value="美食">美食
            </td>
        </tr>
        <tr>
            <td>账号</td>
            <td><input type="text" name="cardNo"></td>
        </tr>
        <tr>
            <td>余额</td>
            <td><input type="text" name="balance"></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="登录"></td>
        </tr>
    </table>
</form>
</body>
</html>

步骤2:修改控制器TestController.java

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @RequestMapping("register")
    public void register(String username,String password,Integer age,Date birthday){
        System.out.println(username+":"+password+":"+age+":"+birthday);
    }    
}

集合类型
使用@RequestParam可使用集合接收多个同名参数的值。
案例:
需求:为多个同名参数传值。
修改TestController.java

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }
	@RequestMapping("register")
    public void register(String username,String password,Integer age,Date birthday,@RequestParam List<String> hobbies,String cardNo,Double balance){
        System.out.println(username+":"+password+":"+age+":"+birthday+":"+hobbies+":"+cardNo+":"+balance);
    }
}

javaBean
javaBean属性:基本数据类型或String
当参数个数太多的时候,spring MVC也可以通过给javaBean来注入对应属性,此时要求
javaBean的属性名与请求参数名相同**。
需求:将用户请求中的参数注入到javaBean中。
步骤1:创建javaBean
User.java

@Data
@ToString
public class User {
    private String username;
    private String password;
    private Integer age;
    private Date birthday;
}

步骤2:修改控制器TestController.java

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }
	@RequestMapping("register")
    public void register(User user){
        System.out.println(user);
    }
}

javaBean属性:引用数据类型
需求:给javaBean中的引用数据类型注入值。
步骤1:自定义引用数据类型Account.java,修改User.java

@Data
@ToString
public class Account {
    private String cardNo;
    private Double balance;
}

@Data
@ToString
public class User {
    private String username;
    private String password;
    private Integer age;
    private Date birthday;
    private Account account;//用于接收自定义类型数据
}

步骤2:修改index.html

<tr>
            <td>账号</td>
            <td><input type="text" name="account.cardNo"></td>
        </tr>
        <tr>
            <td>余额</td>
            <td><input type="text" name="account.balance"></td>
        </tr>

javaBean属性:集合类型
需求:为javaBean的集合类型属性注入值。
步骤1:修改User.java

@Data
@ToString
public class User {
    private String username;
    private String password;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;//用于接收前端表单同名参数的值
    private Account account;
}

自定义类型转换器
在springmvc中,如果给日期类型的参数注入值,需要按照特定的形式输入,比如“2000/10/10”,如果输入“2000-10-10”,则会注入失败,因为spring mvc默认不支持以上形式的日期进行类型转换。要解决这个类型的问题(即用户请求中出现了spring mvc默认类型转换解决不了的值),可以使用自定义类型转换器。
需求:自定义日期类型转换器,输入“2000/10/10”或“2000-10-10”都可以实现日期值的成功注入。
步骤1:创建工具类String2Date.java

@Component
public class String2Date implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        if (StringUtils.isEmpty(s)) {
            throw new RuntimeException("参数不正确");
        }
        try {
            String pattern1="[0-9]{4}-[0-9]{2}-[0-9]{2}";
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            String pattern2="[0-9]{4}/[0-9]{2}/[0-9]{2}";
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
            Date date=null;
            if (s.matches(pattern1)) {
                return sdf1.parse(s);
            }
            if (s.matches(pattern2)) {
                return sdf2.parse(s);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

步骤2:修改springmvc.xml

	<!-- 配置自定义类型转换器 -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!-- 将自定义类型转换器注册到spring MVC类型转换器集合 -->
                <bean class="com.wsjy.converter.String2Date"/>
            </set>
        </property>
    </bean>
	<!-- 注册自定义类型转换器,让自定义类型转换器生效 -->
    <mvc:annotation-driven conversion-service="conversionService"/>

获取Servlet API

​ 需求:在控制器中需要获取servlet API。

​ 实现方式:在控制器方法参数中使用对应的形参接收即可。

步骤1:修改控制器TestController.java

@Controller
public class TestController {
	......
    @RequestMapping("servletapi")
    public void testServletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        System.out.println(session.getServletContext());
    }
}

最后来总结springmvc 的结构:
SpringMVC
WebMVC框架,解决的是将http请求映射到处理程序

1. 加依赖
2. 改头web.xml,加java文件夹
3. 配置web.xml
a. DispatcherServlet 启动子容器  配置文件 {servletname}-servlet.xml    将请求全部接收,转发给Controller
b. ContextLoaderListener 启动父容器 配置文件 applicationContext.xml
c. CharacterEncodingFilter 字符编码集过滤器
4.   woniuxy-servlet.xml  子容器的配置文件
a. 扫包(扫的是controller层)
b. 视图解析器(渲染视图)
ⅰ. 内部资源视图:  前缀  (/WEB-INF/pages/) 后缀(.jsp)
ⅱ. 渲染json视图
c. 注解驱动,@Controller @RequestMapping
d. 静态资源映射 ,可以访问html页面
5.编写controller层发送请求

开发的两种模式
见图:
传统模式
在这里插入图片描述
前后端分离开发模式
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值