springMVC框架的简单使用

springMVC简介

    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

简单使用介绍

    (一)添加依赖jar包

    使用Maven项目添加springMVC依赖jar包spring-webmvc,这个包内包含了spring-aop、spring-beans、spring-context、spring-core、spring-jcl、spring-expression、spring-web包。如果有重复的包无需多次引入。

   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.0.6.RELEASE</version>
   </dependency>
    (二)配置DispatcherServlet

      在web.xml文件中配置springmvc的请求核心控制器DispatcherServlet,让springmvc来处理所有http请求。

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
说明:
    (1)<servlet-name>标签内配置的名字必须和下文的配置文件名匹配。以此处springmvc为例,在WEB-INF下的配置文件名应该是springmvc-servlet.xml。否则可能会引起找不到配置文件的异常。
    (2)<url-pattern>中/和/*的区别:
< url-pattern > / </ url-pattern >   不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /* </ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller报404错。

   (三)创建xxx-servlet.xml配置文件

      在WEB-INF文件夹下创建springmvc-servlet.xml配置文件。 使用注解的形式进行配置,要在配置文件中声明开启组件扫描:

    <context:component-scan base-package="packageFullName"/>
       packageFullName指的是要扫描的包全名,会自动扫描该包及其子包下的所有类的注解。比如com.springmvc.aaa.bbb
如果设置packageFullName为com.springmvc,会自动扫描com.springmvc.aaa以及com.springmvc.aaa.bbb下所有的类以及它们的子包中的类。

    (四)创建一个处理器(Controller)

       处理器(它就是一个servlet的实现,功能和Struts中Action是一样的只不过功能更加灵活)。springMVC可以使用POJO类作为处理器(Struts的Action需要继承ActionSupport类),处理器一般放在xxx.controller包下。这里以一个简单的例子介绍。

//使用注解声明一个处理器HelloController
@Controller
//声明此处理器的访问路径
@RequestMapping("/user")
public class HelloController {
    //声明此方法的访问路径,方法的访问路径是相对于控制器路径的,所以此处全路径应该是/user/hello
    @RequestMapping("/hello")
    //方法的参数可以用来接收用户的请求参数,建议使用包装类型定义否则可能出现转型异常。
    public String helloWorld(String name) {
        System.out.println("请求的参数name是:"+name);
        //跳转到视图,默认方式是转发,重定向使用return "redirect:路径"
        return "/WEB-INF/jsp/success.jsp";
    }
}

      @RequestMapping()属性介绍:

    value:指定请求的实际地址,指定的地址可以是URI Template 模式,默认情况下使用的是这个属性比如上面@RequestMapping("/hello")和@RequestMapping(value="/hello")是等价的;

     method: 指定请求的method类型,除了常规的 GET、POST请求,还有PUT、DELETE等,如果使用了这条属性,则请求方式必须是规定的方式,否则报404错误,(这个特点也就让springmvc有了rest请求风格,下文介绍);    

    params: 指定request中必须包含的参数,如果没有此参数报400错误。

    headers: 指定request中必须包含指定的header值,才能让该方法处理请求。

    consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

    produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
   如果在处理器中的方法上定义:@RequestMapping(value="/hello",method=RequestMethod.GET,headers="User-Agent",params="name"),代表此方法只处理请求路径相对于处理器为/hello、请求头里包括User-Agent参数、具有参数name且请求方式是get的请求。(有点绕,但真的很强大)
    已经知道了处理器里声明的方法是用来处理某种请求的,方法的参数也就是请求的参数。那么就应该想到如果请求传递的是一个复杂类型的参数呢?(比如传入一个集合、传入大量的普通类型参数或其它复杂情况),springmvc也有相应的解决方案。
(1):参数可以是一个普通类,当传入类的属性参数时可以自动封装为一个对象。但要求参数名和属性名一致。
(2):参数可以是一个特殊类型比如集合,但是要使用@RequestParam注解标记该参数。
(3) : 参数可以是HttpServletRequest、HttpServletResponse、HttPSession等对象。

(五)处理器中方法的rest请求风格
    前面说到如果给某个处理器方法配置了@RequestMapping注解并且设置了method属性,那么此方法只会处理规定的请求。换句话说,当两个请求的请求路径(/hello)相同但请求方式(get、post)不同时可以把它们看做是两个请求,可以分别写方法来处理它们。请求方式有post、get、delete、put,那么也就是可以衍生出4中同路径却有不同结果的请求。介绍一个最简单的应用:

    比如经常需要对某个对象进行CRUD操作,那么这4中请求方式刚好可以对应一种操作类型。

    @RequestMapping(value="/user/{user1}", method=RequestMethod.POST)
    public String addUser(@RequestParam(value="user1", required=false) User user){
        System.out.println("调用模型添加一个用户");
        return SUCCESS;
    }

说明:@RequestMapping的value属性可以设置成上面这样,可以把请求参数嵌入请求路径中(常规请求参数:/user?id=xx  嵌入请求参数:/user/{id})。要获取嵌入的参数必须给处理器的对应方法的对应参数设置@RequestParam注解,并且注解的value属性和嵌入参数大括号内的值一样(当然也可以不使用内嵌参数)。@RequestParam的另一个属性required代表此参数是否必须。   

    @RequestMapping(value="/user/{id}", method=RequestMethod.GET)
    public String getUser(@RequestParam(value="id", required=false) Integer id){
        System.out.println("调用模型查找一个用户");
        return SUCCESS;
    }
    @RequestMapping(value="/user/{user1}", method=RequestMethod.PUT)
    public String getUser(@RequestParam(value="user1", required=false) User user){
        System.out.println("调用模型更新一个用户");
        return SUCCESS;
    }
    @RequestMapping(value="/user/{id}", method=RequestMethod.DELETE)
    public String getUser(@RequestParam(value="id", required=false) Integer id){
        System.out.println("调用模型删除一个用户");
        return SUCCESS;
    }
    @RequestMapping(value="/user/{id}", method=RequestMethod.DELETE)
    public String getUser(@RequestParam(value="id", required=false) Integer id){
        System.out.println("调用模型删除一个用户");
        return SUCCESS;
    }

    从宏观角度看,上面这4种请求方式请求的路径都是一样的,都是/user/xxx,但是处理这些请求的方法是不同的。

(六)视图解析器简介   

    最后再介绍一下视图解析器,视图解析器不是必须设置的内容。处理器的工作流程可以简述为: 接收用户发起的请求、调用模型处理请求最终响应。响应视图界面是响应里最常见的一种方式,比如 用户A发起登录请求,处理器调用登录模型进行账户密码验证,验证通过后响应到success.jsp这个界面。但大多数情况下success.jsp这个界面是不会放在项目的根路径下,这样做安全性极差(放在根路径下的jsp页面用户可以直接访问,常见的做法是把除index.jsp的页面放入WEB-INF文件夹下,这个文件夹是受保护的,用户不能直接访问,只能通过控制器获取其中的内容),假如所有的视图界面的.jsp文件都放在WEB-INF文件夹下,那么在处理器中访问时我们就得这么写 return “/WEB-INF/success.jsp”。这只是直接放入的情况,还有可能时里面嵌套了多层文件夹,类似这样“/WEB-INF/**/**/success.jsp”。这样写起来就很累赘,为了解决这个问题,我们要用到视图解析器。视图解析器的作用是自动补充视图文件的路径,包括前缀和后缀部分。   

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置视图前缀为/WEB-INF/jsp/ -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>  
        <!-- 配置视图后缀为.jsp -->
        <property name="suffix" value=".jsp"></property>
    </bean>

    这部分配置写在标题(三)里面介绍的xxx-servlet.xml文件里,配置完成后再次使用return “/WEB-INF/jsp/success.jsp”这种类型的视图路径时,就可以简写为return “success”。

总结

    此内容仅作为学习记录,防止遗忘。如果能给大家带来什么启发也是极好的。另外作者能力有限,如果有什么地方介绍的不清楚或者描述错误,也恳请各位前辈指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值