springmvc

it2025-03-06  26

今天内容安排

1:springmvc

2:整体架构介绍

3、hello world

4、注解

5、如何配置springmvc的访问路径

6、如何接受用户传递过滤的参数

7、json的处理

8、spring的拦截器

9、文件上传。

接收请求,接收参数,返回结果

 

springMVC简介

 

高内聚,低耦合

可扩展性太差

反复迭代

mvc回顾

 

 

springmvc 整体架构

 

 

1、用户发起请求到控制器 DispatcherServlet(前端控制器)

2、前端控制器去handlerMapper查找Handler对象

3、HandlerMapper返回HandlerExecutorChain 执行链(包含两部分内容:Handler ,拦截器集合)

4、前端控制器,通过HandlerAdapter 适配器执行 Handler对象

5、Handler处理具体的业务逻辑

6、Handler处理完业务逻辑之后,返回ModelAndView 其中的View是视图名称

7、将ModelAndView返回前端控制器

8、前端控制器,通过ModelAndView 中的视图名称。在视图解析器中查找视图

9、返回真正的View 视图对象

10、渲染视图

11、返回用户响应

 

第一个springmvc的案例

创建一个maven工程

 

 

 

 

 

引入主pom

 

注意:如果引入之后项目中出现红叉,使用maven-updateProject

 

导入依赖

 

<!-- mvc的依赖 -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-webmvc</artifactId>

        </dependency>

        <!-- 日志依赖 -->

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-log4j12</artifactId>

        </dependency>

 

        <!-- Jackson Json处理工具包 springmvc 处理json数据的 -->

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

        </dependency>

        <!-- jsp相关 -->

        <dependency>

                <groupId>jstl</groupId>

                <artifactId>jstl</artifactId>

            </dependency>

            <dependency>

                <groupId>javax.servlet</groupId>

                <artifactId>servlet-api</artifactId>

                <scope>provided</scope>

            </dependency>

            <dependency>

                <groupId>javax.servlet</groupId>

                <artifactId>jsp-api</artifactId>

                <scope>provided</scope>

            </dependency>

 

配置maven的tomcat插件

 

<build>    

     <plugins>

            <!-- 配置Tomcat插件 -->

            <plugin>

                <groupId>org.apache.tomcat.maven</groupId>

                <artifactId>tomcat7-maven-plugin </artifactId>

                <configuration>

<!--                 项目运行后使用的端口号 -->

                    <port>8080</port>

<!--                 项目访问路径 -->

                    <path>/</path>

                </configuration>

            </plugin>

        </plugins>

    </build>

 

编写配置文件

web.xml

1、创建web.xml

 

2、配置web.xml中的内容

 

3、添加dispatcherServlet

 

spring-mvc的配置

1、添加springmvc-servlet.xml

spring-mvc 会默认去WEB-INF的目录下。寻找${serlvet-name}-serlvet.xml的文件。

所以我们把serlvetmvc的配置文件添加到web-inf的目录下。并且名字与web.xml 中的servlet-name 相同

 

 

 

2、添加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:p="http://www.springframework.org/schema/p"

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

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 

</beans>

 

3、配置HandlerMapping

 

 

 

4、配置handlerAdapter

 

 

 

 

5、自定义Handler(controller)

 

在springmvc-servlet.xml 总配置Handler

 

6、配置视图解析器

 

<!-- 配置视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!--     前缀 -->

    <property name="prefix" value="/WEB-INF/views/"></property>

<!--     后缀 -->

    <property name="suffix" value=".jsp"></property>

</bean>

 

7、定义视图:

 

hello.jsp中的内容:

 

 

 

配置启动

 

测试

 

分析第一个案例的执行过程

 

精简之后的配置

 

 

SpringMVC的默认配置是什么样的

 

默认配置:org.springframework.web.servlet路径下的/org/springframework/web/servlet/DispatcherServlet.properties文件

 

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

 

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

 

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\

    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

 

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\

    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\

    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

 

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\

    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\

    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

 

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

 

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

 

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

 

第一个注解程序

入门案例中的思考:

1、每个类需要继承Controller,麻烦

2、每个类只能处理一个业务逻辑,不能是controller处理多个业务逻辑。

 

使用注解:解决上述两个问题;

 

创建一个hello2Controller类,加上注解

 

配置扫描器springmvc-servlet.xml里

<!-- 配置扫描包,使用 @Controller注解生效 -->

<context:component-scan base-package="cn.itcast.springmvc.controller"/>

 

测试

 

http://localhost:8080/show1.do

 

 

使用推荐使用个的HandlerMapping和HandlerAdapter

<!-- 推荐使用的RequestMappingHandlerAdapter -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

<!-- 推荐使用的RequestMappingHandlerMapping -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

 

使用注解驱动替换推荐的配置

<!-- 配置注解驱动,会默认加载: RequestMappingHandlerAdapter RequestMappingHandlerMapping -->

<mvc:annotation-driven/>

测试

package cn.itcast.springmvc.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

@Controller

@RequestMapping(value="/user")

public class MVCTestController {

@RequestMapping(value="show1")

public ModelAndView test1(){

ModelAndView mv = new ModelAndView();

mv.setViewName("hello");

mv.addObject("msg", "MVCTestController =============test1");

return mv;

}

}

 

使用RequestMapping映射请求

 

在SpringMVC中的众多Controller以及每个Controller的众多方法,请求是如何映射到具体的处理方法上?这个就是靠@RequestMapping完成的。

@RequestMapping既可以定义在类上也可以定义在方法上,

请求映射的规则是:

   

类上面的@RequestMapping.value + 方法上面的@RequestMapping.value。

 

五种映射

1、标准URL映射

2、Ant风格的URL映射

3、占位符映射

4、限制请求方法映射

5、限制参数映射

标准映射

 

测试:

Ant风格的URL映射

通配符

说明

?

匹配任何单字符

*

匹配0或者任意数量的字符

**

匹配0或者更多的目录

 

举例:

@RequestMapping("/test/*/show")

匹配:

/hello/test/a/show.do

/hello/test/b/show.do

都是有效的。

 

hello/test/a/b/c/show.do

 

代码:

 

 

测试:

配置一个 /* 在地址栏中分别输入

http://localhost:8080/demo/show1/a/test.do

http://localhost:8080/demo/show1/b/test.do

 

配置 /** 在地址栏输入

http://localhost:8080/demo/show2/b/a/d/test.do

http://localhost:8080/demo/show2/b/d/test.do

 

占位符映射

 

Url中可以通过一个或多个{xxxx}占位符映射。

通过@PathVariable("xxx")绑定到方法的入参中。

例如:

@RequestMapping("/user/{userId}/query")

请求URL:

http://localhost/user/8/query

 

 

限制请求方法映射

 

 

限制请求方法:

 

 

限定请求参数

Params里的参数编码不能有空格

 

 

处理方法与数据绑定(被动接受)

绑定servlet内置对象

 

 

 

@PathVariable获取占位符中的参数

@RequestParam

注意:当defaultValue有值的时候,required自动修改成false

未设置 defaultValue时,访问时必须带上绑定的参数,否则会报400错误

设置defaultValue后,required属性失效,会自动给出默认值( defaultValue内设置的值)

 

@CookieValue

本地存储

 

 

 

POJO对象绑定参数

SpringMVC会将请求过来的参数名和POJO实体中的属性名进行匹配,如果名称一致,将把值填充到对象中。

 

Java的基本数据类型绑定

 

 

表单代码:

 

<form action="/demos/demo1.action" method="post">

    <div>姓名:</div>

    <div><input name="name" value="张三"/></div>

    <div class="clear"></div>

    <div>年龄:</div>

    <div><input name="age" value="20"/></div>

    <div class="clear"></div>

    <div>收入:</div>

    <div><input name="income" value="100000"/></div>

    <div class="clear"></div>

    <div>结婚:</div>

    <div>

    <input type="radio" name="isMarried" value="true" checked="checked"/>是

    <input type="radio" name="isMarried" value="false"/>否</div>

    <div class="clear"></div>

    <div>兴趣:</div>

    <div>

    <input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌

    <input type="checkbox" name="interests" value="书法" checked="checked"/>书法

    <input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影

    </div>

    <div class="clear"></div>

    <div><input type="submit" value="提交表单"/></div>

</form>

 

 

 

集合List绑定

 

解决方案2:参考json处理。

 

如果方法需要接受的list集合,不能够直接在方法中书写List

List的绑定,需要将List对象包装到一个类中才能绑定

要求:表单中的name的值

要求表单name的值, 和封装的对象中的结合的属性名一致。

如下:

 

类:

 

 

 

springmvc 和struts2的区别

 

jsp 和jstl视图解析器

导入jstl的依赖

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>

<html>

<head>

<title>JSTL Demo</title>

</head>

<body>

    <table>

        <thead>

            <tr>

                <th>ID</th>

                <th>用户名</th>

                <th>名称</th>

                <th>年龄</th>

            </tr>

        </thead>

        <tbody>

            <c:forEach items="${users}" var="user">

                <tr>

                    <td>${user.id}</td>

                    <td>${user.userName}</td>

                    <td>${user.name}</td>

                    <td>${user.age}</td>

                </tr>

            </c:forEach>

        </tbody>

    </table>

</body>

</html>

 

controller代码

/**

* return 集合数据到jsp页面

* @return

*/

@RequestMapping("test9")

public ModelAndView test9(){

ModelAndView mv = new ModelAndView();

List<User> userList = new ArrayList<User>();

for(Long i = 1L;i < 6L;i++){

User u = new User();

u.setId(i);

u.setuserName("楚留香"+i+"");

u.setName("盗帅"+i+"");

u.setAge(700);

userList.add(u);

}

mv.setViewName("users");

mv.addObject("users", userList);

return mv;

}

 

 

使用ResponseBody输出JSON

10.1 ajax请求通常返回json数据,异步方法要使用@ResponseBody注解标明返回json

 

单个对象的输出:

@RequestMapping("getUser")

@ResponseBody

public User getUser(){

 

User user = new User();

user.setuserName("西门吹牛");

user.setName("西门吹雪");

user.setAge(1);

return user;

}

 

集合的输出:

@RequestMapping("getUsers")

@ResponseBody

public List<User> getUsers(){

 

List<User> users = new ArrayList<User>();

for(int i =0;i<8;i++){

User user = new User();

user.setuserName("西门吹"+i+"牛");

user.setName("西门吹雪"+i);

user.setAge(i+1);

users.add(user);

}

return users;

}

RequestBody

 

代码:

 

 

测试:

 

 

 

文件上传

添加依赖

<dependency>

            <groupId>commons-fileupload</groupId>

            <artifactId>commons-fileupload</artifactId>

            <version>1.3.1</version>

        </dependency>

 

定义文件上传解析器

定义在springmvc-servlet.xml里面

<!-- 定义文件上传解析器 -->

    <bean id="multipartResolver"

        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <!-- 设定默认编码 -->

        <property name="defaultEncoding" value="UTF-8"></property>

        <!-- 设定文件上传的最大值5MB5*1024*1024 -->

        <property name="maxUploadSize" value="5242880"></property>

    </bean>

 

代码:

package cn.itcast.springmvc.controller;

 

import java.io.File;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.multipart.MultipartFile;

 

@RequestMapping("/file")

@Controller

public class FileUploadController {

/**

* 文件上传

*/

    @RequestMapping("/upload")

    public String upload(@RequestParam("file") MultipartFile multipartFile)

            throws Exception {

        if (multipartFile != null) {

          

            // multipartFile.getOriginalFilename() 获取文件的原始名称

            multipartFile.transferTo(new File("d:\\tmp\\" + multipartFile.getOriginalFilename()));

        }

        return "success";

    }

}

测试

转发和重定向

 

重定向

使用视图名字前加:redirect:/success.html

 

 

访问路径:

 

实际响应后路径:

 

转发:

在视图名称前加上: forward:

 

拦截器

 

 

拦截器执行过程

 

编写自定义拦截器

 

配置拦截器

    <mvc:interceptors>

        <mvc:interceptor>

<!--             path: 拦截所有请求 -->

            <mvc:mapping path="/**"/>

<!--             class:指定拦截器 -->

            <bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor"/>

        </mvc:interceptor>

    </mvc:interceptors>

 

配置多个拦截器

多个拦截器执行顺序遵循 先入后出 的原则,先执行的拦截器后执行完成

    <mvc:interceptors>

        <mvc:interceptor>

<!--             path: 拦截请求 -->

            <mvc:mapping path="/user/**"/>

<!--             class:指定拦截器 -->

            <bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor"/>

        </mvc:interceptor>

        <mvc:interceptor>

            <mvc:mapping path="/user/**"/>

            <bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor2"/>

        </mvc:interceptor>

    </mvc:interceptors>

 

练习重点:

    <servlet>

        <servlet-name>springmvc</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!--         服务器启动时加载上面的DispatcherServlet -->

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>springmvc</servlet-name>

<!--         尽量不要配置/*,/*会拦截静态资源

            拦截以.do结尾的请求,拦截后交给DispatcherServlet处理 -->

        <url-pattern>*.do</url-pattern>

    </servlet-mapping>

 

视图解析器配置

<!-- 配置视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!--     前缀 -->

    <property name="prefix" value="/WEB-INF/views/"></property>

<!--     后缀 -->

    <property name="suffix" value=".jsp"></property>

</bean>

 

Springmvc注解的使用(重点)

@Controller : 注解一个控制器类,要配置注解扫描 <!-- 注解扫描 -->

<context:component-scan base-package="cn.itcast.springmvc.controller"/>

@RequestMapping(value="/**/{userid}/请求名称",method,param={}) :可以放在控制器类头,然后每个请求响应方法都应该有一个对应的mapping注解, 绝大多数时候,要求注解里的请求名称和方法名称保持一致,限定请求方式(method属性),限定请求参数(param属性),必须带某个参数或者必须不带某个参数,限定参数的值

@RequestParam(value="参数名称") :绑定请求参数,要求请求中设定的参数必须带,如果没带可以设置默认值

@RequestBody :将请求参数中的json数据转换成java对象

@ResponseBody :将返回结果java对象转换成json数据的格式返回到视图 ,通常在异步请求中使用

@PathVariable :获取请求路径占位符中的参数

笔记第7大项是练习的重点

文件上传和拦截器的定义,要求定义成功即可

转载于:https://www.cnblogs.com/beyondcj/p/6271173.html

相关资源:SpringMVC+Hibernate+Spring整合实例
最新回复(0)