spring mvc 学习笔记1

一.搭建spring mvc 的hello world

1.添加jar包:

commons-logging-1.1.1.jar

spring-aop-4.1.6.RELEASE.jar

spring-beans-4.1.6.RELEASE.jar

spring-context-4.1.6.RELEASE.jar

spring-core-4.1.6.RELEASE.jar

spring-expression-4.1.6.RELEASE.jar

spring-web-4.1.6.RELEASE.jar

spring-webmvc-4.1.6.RELEASE.jar

至少这8个。

2.在web.xml里配置拦截servlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- 配置 DispatcherServlet -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
        <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>
其中:

<!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
用来说明配置文件的地址,在src下面的spring.xml文件,这个文件的名字可以自己定义。

3.写spring.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

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

    <!--配置前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

主要有两个属性需要配置,一个是控制器controller的包,用来扫描。还有一个是资源是图解析器,用来生成视图文件的位置,跟目录是 WEB目录下。

对应jsp就是:prefix + return返回的字符串 + suffix后缀。

4.编写控制类代码,返回success,对应web目录下success.jsp文件:

@Controller
public class HelloWorld {

    @RequestMapping("/hello")
    public String hello() {
        System.out.print("hello world");
        return "success";
    }
}


流程:url请求--DispatcherServlet拦截--根据sprig配置文件查找扫描包--查找控制器--查找方法--获取返回值--根据拼接得到对应视图--显示



二.各种注解使用:

1.注解@Controller:放置在类上,用来说明这个类是控制器。


2.注解@RequestMapping:请求映射,解析url,确定请求的类和类中的方法:

1. @RequestMapping 除了修饰方法, 还可来修饰类 ,若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录

2. 1). 类定义处: 类似于package的概念。

            2). 方法处: 提供进一步的细分映射信息。 相对于类定义处的 URL。

3.可以使用 method 属性来指定请求方式,这样只有post提交才会执行

/**
     * 常用: 使用 method 属性来指定请求方式
     */
    @RequestMapping(value = "testRequestMappingPostMethod", method = RequestMethod.POST)
    public String testRequestMappingPostMethod() {
        System.out.print("testRequestMappingPostMethod");
        return SUCCESS;
    }

4.还有params和headers属性,用来进一步确认映射关系,其中有requerid属性来确定是否必须拥有:

/**
     * 了解: 可以使用 params 和 headers 来更加精确的映射请求. params 和 headers 支持简单的表达式.
     */
    @RequestMapping(value = "testParams", params = {"username", "password"})
    public String testParams() {
        System.out.print("testParams");
        return SUCCESS;
    }

@RequestMapping(value = "testParamsAndHeaders", params = { "username",
			"age!=10" }, headers = { "Accept-Language=en-US,zh;q=0.8" })
	public String testParamsAndHeaders() {
		System.out.println("testParamsAndHeaders");
		return SUCCESS;
	}

3.注解@PathVariable:用来获取占位符的值,可以来映射 URL 中的占位符到目标方法的参数中:

    /**
     * @PathVariable 可以来映射 URL 中的占位符到目标方法的参数中.
     */
    @RequestMapping(value = "testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id) {
        System.out.print("testPathVariable" + id);
        return SUCCESS;
    }


请求的链接是:

<a href="/test/testPathVariable/121">testPathVariable</a>
121就会在参数id中。

4.注解@RequestParam:用来获取传递过来的参数

请求的链接:

<a href="/test/testRequestParams?username=zhulei&password=123456">testRequestParams</a>

处理的代码:

/**
     * @RequestParam 来映射请求参数. value 值即请求参数的参数名 required 该参数是否必须. 默认为 true
     *               defaultValue 请求参数的默认值
     */
    @RequestMapping(value = "testRequestParams")
    public String testRequestParams(@RequestParam(value = "username") String username, @RequestParam(value = "password", required = false) String password) {
        System.out.println("username = " + username + ";" + "password = " + password);
        return SUCCESS;
    }

在方法的参数上加上这个注解,对应的参数就会为传递过来的参数。


5.注解@RequestParam:用来获取请求中的头部的一些信息:

/**
     * 了解: 映射请求头信息 用法同 @RequestParam
     */
    @RequestMapping(value = "testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept-Language") String info) {
        System.out.println("Accept-Language = " + info);
        return SUCCESS;
    }

这里,就是获取到了http协议,请求头部中的accept-language字段的信息,和@RequestParam用法一样,就是获取的是头部的信息


三. 常用请求方法参数方面

1.注解@CookieValue:获取coolie中的信息:

/**
     * 了解:
     *
     * @CookieValue: 映射一个 Cookie 值. 属性同 @RequestParam
     */
    @RequestMapping(value = "testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String id) {
        System.out.println("JSESSIONID = " + id);
        return SUCCESS;
    }

2.类似第5个注解@requestparam,可以直接把表单的信息封装成一个对象来获取,这点和struts2的交互一样


前台表单:

<form action="/test/testPOJO">
    username:<input type="text" name="username"><br>
    password:<input type="password" name="password"><br>
    province:<input type="text" name="address.province"><br>
    city:<input type="text" name="address.city"><br>
    <input type="submit" value="submit-put"><br>
</form>

处理类,接受表单的user信息,其实是调用pojo类的set方法进行设置,然后放到参数user中,支持二级映射:

/**
     * Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。支持级联属性。
     * 如:dept.deptId、dept.address.tel 等
     */
    @RequestMapping(value = "testPOJO")
    public String testPOJO(User user) {
        System.out.println(user.toString());
        return SUCCESS;
    }

3.可以使用 Serlvet 原生的 API 作为目标方法的参数 具体支持以下类型

HttpServletRequest 

HttpServletResponse

 HttpSession

java.security.Principal 

Locale InputStream

OutputStream 

Reader 

Writer


例子:

@RequestMapping(value = "testServletApi")
    public String testServletApi(HttpServletRequest request, HttpServletResponse response, Writer out) throws IOException {
        System.out.println(request.toString() + ";" + response.toString());
        out.write("hello");
        return SUCCESS;
    }

直接把原生的servlet api类 当作参数,放到请求方法里,就会自动赋值,获取这些类

这里直接调用Writer,写了一个hello输出。


四.处理数据模型

第三部分是获取网页传过来的数据到java的请求方法中,做法是使用方法参数自动赋值,这部分是把处理好的数据返回给页面。


1.使用ModelAndView返回类型

    /**
     * 处理数据模型之ModelAndView
     */
    /**
     * 目标方法的返回值是 ModelAndView 类型。
     * 其中可以包含视图和模型信息
     * SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中.
     * @return
     */
    @RequestMapping(value = "testModleAndView")
    public ModelAndView testModleAndView() {
        String viewName = SUCCESS;
        ModelAndView modelAndView = new ModelAndView(viewName);
//        填充数据
        modelAndView.addObject("date", new Date());
        return modelAndView;
    }

SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中,这样前台就可以获取到这些值。

前台代码:

${requestScope.date}

2.使用Map作为方法参数:

    /**
     * 处理数据模型之Map
     */
    /**
     * 目标方法可以添加 Map 类型(实际上也可以是 Model 类型或 ModelMap 类型)的参数.
     * @param map
     * @return
     */
    @RequestMapping(value = "testMap")
    public String testMap(Map<String, Object> map) {
        map.put("name", Arrays.asList("tom", "jerry", "zhulei"));
        return SUCCESS;
    }

同样,SpringMVC 会把 map 的 中数据放入到 request 域对象中,这样前台就可以获取到这些值。


3.使用注解@SessionAttributes,把数据放到session中:


这个注解只能放在类上面:

@SessionAttributes(value = {"user"}, types = {String.class})

有两个参数可以设置,value和types。

value是一个字符串数组,用来说明这个控制器类的方法中,被放入request中的数据的名字只要是定义好的,也放入session中。

types是定义类的类型,被放入request中的类的类型只要是定义好的,也放入session中

    /**
     * 处理数据模型之SessionAttributes
     */
    /**
     * @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),
     * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)
     *
     * 注意: 该注解只能放在类的上面. 而不能修饰放方法.
     */
    @RequestMapping(value = "testSessionAttribute")
    public String testSessionAttribute(Map<String, Object> map) {
        User user = new User();
        user.setUsername("zhulei");
        user.setPassword("123");
        map.put("user", user);
        map.put("string", "stringData");
        return SUCCESS;
    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值