SpringMVC笔记(一)

SpringMVC 概述

  • Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一
  • Spring3.0后全面超越Struts2,成为最优秀的MVC框架
  • Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口。
  • 支持REST风格的URL请求
  • 采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性

SpringMVC HelloWorld

  • 步骤
    • 加入 jar 包
    • 在 web.xml 中配置 DispatcherServlet
    • 加入 Spring MVC 的配置文件
    • 编 写 处 理 请 求的 处 理器,并 标识为处 理器
    • 编 写 视图
  • 需要 jar 包
commons-logging-1.1.1.jar
spring-aop-4.0.2.RELEASE.jar
spring-beans-4.0.2.RELEASE.jar
spring-context-4.0.2.RELEASE.jar
spring-core-4.0.2.RELEASE.jar
spring-expression-4.0.2.RELEASE.jar
spring-web-4.0.2.RELEASE.jar
spring-webmvc-4.0.2.RELEASE.jar

1. 在web.xml中配置DispatcherServlet

DispatcherServlet默认加载/WEB-INF/ servletName-servlet.xml的Spring配置文件,启动WEB层的Spring容器。可以通过 contextConfigLocation 初始化参数自定义配置文件的位置和名称

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

    <!-- 配置 DispatcherServlet -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置 DispatcherServlet 的一个初始化参数 : 配置 SpringMVC 配置文件的位置和名称 -->
        <!-- 
            实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的。
            默认的配置文件为 : /WEB-INF/servletName-servlet.xml
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>  

</web-app>

2. 创建Spring MVC配置文件

配置自动扫描的包
配置视图解析器:视图名称解析器:将视图逻辑名解析为: /WEB-INF/pages / viewName .jsp

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- 配置自定扫描的包 -->
    <context:component-scan base-package="com.anqi.springmvc"></context:component-scan>

    <!-- 配置视图解析器 : 如何把 handler 方法返回值解析为实际的物理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

3. 创建请求处理器类

@Controller
public class HelloWorld {   
    /**
     * 1. 使用 @RequestMapping 注解来映射请求的 URL
     * 2. 返回值会通过视图解析器解析为实际的物理视图, 对于 InternalResourceViewResolver
     * 视图解析器, 会做如下的解析
     * 
     * /WEB-INF/views/success.jsp
     * 
     * @return
     */
    @RequestMapping("/helloworld")
    public String hello() {
        System.out.println("hello world");
        return "success";
    }
}

使用 @RequestMapping 映射请求

1. 修饰类

@RequestMapping("/springmvc")
@Controller()
public class TestRequestMapping {
    private static final String SUCCESS = "success";

    /**
     * 1. @RequestMapping 除了修饰方法, 还可以用来修饰类
     * 2.
     *   1). 类定义处 : 提供初步的请求映射信息, 相对于 WEB 应用的根目录 
     *   2). 方法处 : 提供进一步的细分映射信息。
     *               相对于类定义处的 URL, 若类定义出未标注 @RequestMapping 则方法处标记的 URL
     *               相当于 WEB 的根目录
     * @return
     */
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping() {
        System.out.println("testRequestMapping");
        return SUCCESS;
    }

//下列方法均在此类中
<a href="helloworld">hello World</a>
<br/><br/>

success.jsp
在 WEB-INF/view目录下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <font color="red">Success</font>
</body>
</html>

2. 请求方式

/**
 * 使用 method 属性来指定请求的类型
 * @return
 */
@RequestMapping(value="/testMethod", method=RequestMethod.POST)
public String testMethod() {
    System.out.println("testMethod");
    return SUCCESS;
}
<a href="springmvc/testRequestMapping">Test RequestMapping</a>
<br/><br/>

3. 请求参数 & 请求头

/**
 * 仅需了解
 * 可以使用 params 和 headers 来更加精确映射需求, params 和 headers 支持简单的表达式
 * @return
 */
@RequestMapping(value="testParamsAndHeaders",params= {"username","age!=10"},
        headers= {"Request Method=GET"})
public String testParamsAndHeaders() {
    System.out.println("testParamsAndHeaders");
    return SUCCESS;
}
<!-- a 标签时 get 所以无法被 POST 类型方法的转发器处理 -->
<a href="springmvc/testMethod">TestMethod GET</a>
<br/><br/>

<form action="springmvc/testMethod" method="post">
    <input type="submit" value="提交post请求"/>
</form>
<br/><br/>

4. Ant 路径

/**
 * 支持通配符 * 
 * @return
 */
@RequestMapping("/testAntPath/*/abc")
public String testAntPath() {
    System.out.println("testAntPath");
    return SUCCESS;
}
<a href="springmvc/testAntPath/xxx/abc">Test AntPath</a>
<br/><br/>

5. PathVariable 注解映射 URL 绑定占位符

@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id")Integer id) {
    System.out.println("testPathVariable-- "+id);
    return SUCCESS;
}
<a href="springmvc/testPathVariable/1">testPathVariable/1</a>

6. HiddenHttpMethodFilter 过滤器

浏览器form 表单只支持GET 与POST 请求,而DELETE、PUT 等method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的http 方法,使得支持GET、POST、PUT 与DELETE 请求。

在web.xml中配置

<!-- 配置 HiddenHttpMethodFilter : 可以把 POST 请求转化为 DELETE 请求或者 PUT 请求-->
<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<a href="springmvc/testRest/5">Test Rest Get</a>
<br><br>

<form action="springmvc/testRest" method="post">
    <input type="submit" value="TestRest POST"/>
</form>
<br/><br/>

<form action="springmvc/testRest/1" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" name="_method" value="TestRest DELETE">
</form>
<br/><br/>

<form action="springmvc/testRest/1" method="post">
    <input type="hidden" name="_method" value="PUT"/>
    <input type="submit" name="_method" value="TestRest PUT">
</form>
<br/><br/>
/**
 * Rest 风格的 URL
 * 以 CRUD 为例
 * 新增 : /order/ POST    
 * 修改 : /order/1 PUT     update?id=1
 * 获取 : /order/1 GET     get?id=1
 * 删除 : /order/1 DELETE  delete?id=1
 * 
 * 如何发送 PUT 请求和 DELETE 请求呢
 * 1. 需要配置 HiddenHttpMethodFilter
 * 2. 需要发送 POST 请求
 * 3. 需要在发送 POST 请求时携带一个 name="_method" 的隐藏域,值为 DELETE 或 PUT
 * 
 * 在 SpringMVC 的目标方法中如何获得 id 呢?
 * 使用 @PathVariable 注解
 */
@RequestMapping(value="/testRest/{id}",method=RequestMethod.PUT)
public String testRestPut(@PathVariable Integer id) {
    System.out.println("testRest PUT:"+ id);
    return SUCCESS;
}
@RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)
public String testRestDelete(@PathVariable Integer id) {
    System.out.println("testRest DELETE:"+ id);
    return SUCCESS;
}
@RequestMapping(value="/testRest",method=RequestMethod.POST)
public String testRestPost() {
    System.out.println("testRest POST:");
    return SUCCESS;
}
@RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)
public String testRestGet(@PathVariable Integer id) {
    System.out.println("testRest GET:"+ id);
    return SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值