菜鸟学习 8-3 SpringMVC 入门案例的一些深入

入门案例的一些深入

一、@RequestMapping注解的详解

1)该注解可以放在方法上,也可以放在类上,放在方法上用于给方法确定路径和加限制条件,放在类上用于给类确定路径,如果类和方法上都有,在请求方法时就需要加上类名/方法名,例如给类命名为/user,给方法命名为/hello,请求时地址就应该user/hello。
2)该注解常用的参数有4个,分别为value、path、method、header
其中value和path作用相同,用于给类或方法确定路径(个人理解为给方法取名)。其中value是缺省值。
method用于给方法限定请求方法,有GET,POST,PUT,PATCH等等,如果不写默认值与前端参数配置一致。
header用于限制请求头。
其中method和header都可以设置多个,用大括号{}包起来。

二、请求参数绑定

如果前端jsp页面有传入属性,按照传统的方式需要在方法里用getParam方法获取,SpringMVC为我们提供一些更加简单方便的手法:
1)如果传入的是一些简单的规范的参数,例如String、Interger等,SpringMVC可以为我们自动适配,前提是在jsp中参数名要和方法的参数名一致,举例:
在前端jsp写一个超链接并且带上名为username和password的参数

<a href="param/testParam?username=hehe&password=123">请求参数绑定</a>

在Controller中写如下方法:

 /**
     * 请求参数绑定入门
     * 如果jsp传过来的参数名与方法的参数名一致,springmvc会自动帮忙对应上,不必再写requestgetparam...`在这里插入代码片`
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("执行了。。。");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        return "success";
    }

注意方法中的参数username和password和jsp中的一致,所以不需要做任何操作就能自动获取。
运行服务器,会在转跳到success.jsp页面的同时,控制台会输出相应的用户名和密码。

2)当传入的参数是某个JavaBean也可以实现自动封装和传输。
例如我有一个名为Account的JavaBean,里面有username、Passover、money3个参数,和另外的JavaBean的引用:User。

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    
    private User user;
    
    public void get...(){...}
    public void set...(){...}
    public String toString(){...}
}

然后在前端:

<%--把数据封装Account类中--%>
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        金额:<input type="text" name="money"/><br/>
        用户姓名:<input type="text" name="user.uname"/><br/>
        用户年龄:<input type="text" name="user.age"/><br/>
        <input type="submit" value="提交"/><br/>
    </form>

只需保持参数名和JavaBean中的参数名保持一致,SpringMVC就会自动把数据封装到JavaBean中。
注意:其中User类的属性要用user.uname这种方式来命名。
只要Controller中的方法的参数是Account,和JavaBean名称一致,值也能自动传输进来:

/**
     * 请求参数绑定 吧数据封装到javabean中 只要参数名和实体类中的参数名对应,MVC会自动帮你封装到javabean中
     * 如果在javabean中有引用别的javabean,在jsp页面的参数名那里就要写user.uname;user.age
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }
三、自定义类型转换器

其实在jsp页面上传输过来的参数都是string类型,传入后端之后再由框架进行转换,比如在password中我们输入的是数字,Integer类型,但是传输的时候是作为String类型传输的,传到Controller里就再次转换为Integer类型。Spring框架为我们提供了很多诸如此类的转换,称之为类型转换器。但是很多也并代表能囊括所有情况,我们开发时还会遇到各种其他情况,这时候需要自定义类型转换器。
假如我需要一个Date类型的参数,SpringMVC给我们提供了一个基础的转换器:假如前端输入的是2020/08/03,这样用斜杠隔开的格式,就可以转换成Date类型的数据,但是如果前端输入的是2020-08-03这样用横杠分搁的方式,就不行了,我们可以自定义一个转换器实现用横杠也可以。
1)编写我们的控制器:
创建一个utils包,在包下建立一个StringToDateConverter类:

/**
 * 吧字符串转换成日期
 */
public class StringToDateConverter implements Converter<String,Date> {

    /**
     *
     * @param s     传入进来的字符串
     * @return
     */
    public Date convert(String s) {
        //判断
        if(s == null){
            throw new RuntimeException("请宁传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            //吧字符串转成日期
            return df.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

2)在前端控制器中配置类型转换器
在springmvc.xml中加入如下配置:

<!--开启注解扫描-->
    <context:component-scan base-package="cn.itcast"/>

    <!--视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.itcast.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--开启SpringMVC框架注解的支持-->
    <mvc:annotation-driven conversion-service="conversionService"/>

</beans>

并且要在mvc:annotation-driven标签中加入conversion-service属性。

这样就完成自定义转换器的编写和配置了。再输入2020-08-03
这样的格式也能自动转换成Date类型。

四、获取Servlet原生API

只需要在方法的参数中加上HttpServletRequet类型和HttpServletResponse类型的参数就可以了。

/**
     * 原生的API获取
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("执行了。。。");
        System.out.println(request);
        HttpSession session = request.getSession();
        System.out.println(session);
        ServletContext servletContext = session.getServletContext();
        System.out.println(servletContext);

        System.out.println(response);
        return "success";
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值