`

spring日记(十一):Spring MVC

阅读更多

注解驱动以及REST风格的Spring MVC是spring3.0最出彩的功能之一。

先来定义spring MVC的主控Servlet:DispatcherServlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    //http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- ① 配置业务层和持久层的spring配置文件,这些配置文件是业务层父spring容器所使用到的-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/conf/applicationContext.xml</param-value>
    </context-param>
    <!-- ② 负责启动spring容器的监听器,它将引用①处的上下文参数获得spring文职文件地址-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- ③ 声明DispatchServlet,这个是spring MVC的主控Servlet
        默认会加载/WEB-INF/baobaotao-servlet.xml(即<servlet-name>-servlet.xml)的
        spring配置文件,启动Web层的spring容器-->
    <servlet>
        <servlet-name>baobaotao</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- ④ 声明被上面定义的servlet所匹配截获的URL模式-->
    <servlet-mapping>
        <servlet-name>baobaotao</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
 
</web-app>

我们知道多个spring容器之间可设置为父子容器关系,实现良好的解耦。在这里,web 层的spring容器将作为业务层spring容器的子容器,即web层容器可以引用业务层容器的bean,而业务层容器却访问不到web层容器的bean。

需要提醒的是,一个web.xml可以配置多个DispatcherServlet,通过其<servlet-mappping>的配置,让每个DispatcherServlet处理不同的请求。

DispatcherServlet遵循约定大于配置原则,多数情况下只要按契约来就行,不过也可以手动修改:

* namespace:默认为<servlet-name>-servlet,修改成springzoo后对应的web层的spring配置文件为/WEB-INF/springzoo.xml

* contextConfigLocation:如果DispatcherServlet上下文对应的spring配置文件有多个,则可以使用这个属性来指定多个配置文件,如classpath:springzoo01.xml,classpath:springzoo02.xml

* publishContext:默认为true,决定是否将WebApplicationContext发布到ServletContext中去。

* publishEvents:boolean类型,当DispatcherServlet处理完一个请求后,是否向容器发布一个ServletRequestHandledEvent事件,默认为true

>> 编写处理请求的控制器:

@Controller
@RequestMapping("/user")
public class UserController {
 
    @Autowired
    private UserService userService;
 
    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView createUser(User user) {
        userService.createUser(user);
        ModelAndView mav = new ModelAndView();
        mav.setViewName("user/createSuccess");
        mav.addObject("user", user);
        return mav;
    }
 
    @RequestMapping(value = "/register", method = RequestMethod.GET, params = "!myParam")
    public String register(@ModelAttribute("user") User user) {
        return "user/register";
    }
}

在类上面定义的@RequestMapping是相对于部署根目录而言,在方法上定义的相对于类而言,如果类上没有,方法上就是相对于根目录而言,而return返回的字符串是一个逻辑视图名,怎样去映射到一个真正的视图对象,这个就需要视图解析器了。

配置spring MVC的配置文件:

<?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" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        //http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        //http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        //http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
 
    <!-- 扫描web目录下的类,让所有的spring注解生效-->
    <context:component-scan base-package="com.baobaotao.web" />
 
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:order="100" p:viewClass="org.springframework.web.servlet.view.JstlView"
        p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
 
    <mvc:annotation-driven conversion-service="conversionService" />

>> 使用@RequestMapping映射请求

在一个普通的POJO类上标注@Controller,再通过<context:component-scan/>扫描相应的类包,既可以使POJO称为一个能处理HTTP请求的控制器。

在控制器的类和方法上都能定义@RequestMapping,在类定义初步映射信息,方法处进一步提供详细映射信息,映射规则有URL、请求参数、请求方法、请求头这4个方面的信息,下面分别讲解:

* 通过请求URL进行映射

@RequestMapping(value = "/register")
public String register(@ModelAttribute("user") User user) {
    return "user/register";
}

@RequestMapping不但支持标准URL,还支持Ant风格即? * **的字符,?代表一个字符,*代表任意字符串,**代表任意层级数的目录

@RequestMapping还支持带占位符的URL{XXX},比如/user/**/{userId}

带占位符的URL是spring3新增的功能,该功能在spring MVC向REST目标挺进的发展过程中有里程碑的意义,通过@PathVariable可以将URL中的占位符参数绑定到控制器处理方法的入参中去:

@RequestMapping(value = "/handle44/{imageId}")
public ResponseEntity<byte[]> handle44(@PathVariable("imageId") String imageId) throws Throwable {
    Resource res = new ClassPathResource("/image.jpg");
    byte[] fileData = FileCopyUtils.copyToByteArray(res.getInputStream());
ResponseEntity<byte[]> responseEntity = new ResponseEntity

通过请求方法和请求参数映射,在方法中使用@RequestParam将方法参数和请求参数绑定,利用@RequestHeader将方法参数和请求头参数绑定:

@RequestMapping(value = "/delete", method = RequestMethod.POST, params = "userId")
public String test1(@RequestParam("userId") String userId) {
    // do sth
    return "user/test1";
}

@RequestMapping的value、method、params以及headers分别表示请求URL、请求方法、请求参数以及报文头的映射条件,params和headers支持简单的表达式:

* "userId":表示请求必须包含名为userId的请求参数
* "!userId":表示请求参数不包含userId的请求参数
* "userId!=yidao":表示请求参数包含userId,但不等于yidao
* {"userId=yidao","password"}:表示啥自己去想下
几种典型的用法:
// ①请求参数按名称匹配的方式绑定到方法入参中,方法返回对应的字符串代表逻辑视图名,
    // 如果没有userName这些按契约规定的请求参数,会抛出异常滴
@RequestMapping(value = "/handle1")
public String handle1(@RequestParam("userName") String userName,
        @RequestParam("password") String password,
        @RequestParam("realName") String realName) {
    return "success";
}
 
// ②将Cooke值及报文头属性绑定到入参中、方法返回ModelAndView
@RequestMapping(value = "/handle2")
public ModelAndView handle2(@CookieValue("JSESSIONID") String sessionId,
        @RequestHeader("Accept-Language") String accpetLanguage) {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("success");
    mav.addObject("user", new User());
    return mav;
}
 
// ③请求参数按名称匹配的方式绑定到user的属性中、方法返回对应的字符串代表逻辑视图名
@RequestMapping(value = "/handle3")
public String handle3(User user) {
    return "success";
}
 
// ④直接将HTTP请求对象传递给处理方法、方法返回对应的字符串代表逻辑视图名
@RequestMapping(value = "/handle4")
public String handle4(HttpServletRequest request) {
    return "success";
}
还可以使用命令/表单对象绑定请求参数值:
命令/表单对象就是简单额POJO,并且支持级联绑定,比如detp.deptId, dept.address.tel等:
@RequestMapping(value = "/handle14")
public String handle14(User user) {
    return "success";
}

还能使用Servlet API对象作为入参:

@RequestMapping(value = "/handle21")
public void handle21(HttpServletRequest request, HttpServletResponse response) {
    String userName = request.getParameter("userName");
    response.addCookie(new Cookie("userName", userName));
}
你妹的,居然还可以使用IO对象作为入参,自动将InputStream/Reader绑定到ServletRequest的InputStream/Reader,将OutputStream/Writer绑定到ServletResponse的OutputStream/Writer上面:
@RequestMapping(value = "/handle31")
public void handle31(OutputStream os) throws IOException {
    Resource res = new ClassPathResource("/image.jpg");
    FileCopyUtils.copy(res.getInputStream(), os);
}
 

 本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    Spring MVC入门

    Spring MVC入门

    Java毕设:基于SSM的高校运动会管理系统(spring+spring mvc+mybatis+mysql)1008

    系统按预定的算法完成了创办运动会、广播公告公示、赛事项目拟订、报名参赛、赛后成绩录入、查看比赛成绩、院系人员的信息存储、反馈建议、访问日记等功能。 详情:...

    基于java web技术实现日记本管理系统附项目源码+数据库文件+文档说明

    例如,Spring MVC框架可以帮助开发人员构建Web应用程序的控制器、视图和模型,简化了Web应用程序的开发过程。 2. 提高可维护性:Spring框架的设计思想是基于面向对象的编程,它鼓励开发人员编写松耦合的代码,提高...

    SpringMVC实现动态加表及字段并显示数据

    SpringMVC实现动态加表及字段并显示数据

    学习ssh框架日记

    4 struts 机制工作流程:在web应用启动时就会加载初始ActionServlet ,ActionServlet从struts-...1.spring mvc请所有的请求都提交给DispatcherServlet ,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

    ssm项目生活小助手微信小程序_k1s0l.zip

    SSM项目生活小助手微信小程序_k1s0l.zip是一个使用Java语言开发的Web应用,它采用了SSM(Spring Spring MVC MyBatis)框架,并结合了微信小程序前端技术。该系统旨在为用户提供一个多功能的生活管理平台,使得用户...

    基于SSM的高校运动会管理系统的设计与实现

    项目描述 摘要:该高校运动会信息管理系统是以B/S架构为设计基础并基于SSM框架开发的系统,系统以IntelliJ IDEA作为开发工具,采用了Java语言和MySQL数据库来实现。...spring+spring mvc+mybatis+bootstrap+jquery

    基于SSM的高校运动会管理系统的设计与实现(毕设)

    摘要:该高校运动会信息管理系统是以B/S架构为设计基础并基于SSM框架开发的系统,系统以IntelliJ IDEA作为开发工具,采用了Java语言和MySQL数据库来实现。...spring+spring mvc+mybatis+bootstrap+jquery

    计算机专业毕业实习日记.docx

    Struts这个框架其实就是Java MVC设计模式中简称Model1与Model2Model2的一个具体实现,Spring 则通过提供ICO控制反转,也称依赖注入实现了对对象甚至事务如声明式事务的集中管理,此外还引入了AOP对向切面编程,当然...

    高校运动会信息管理系统

    该高校运动会信息管理系统是以B/S架构为设计基础并基于SSM框架开发的系统,系统以IntelliJ IDEA...spring+spring mvc+mybatis+bootstrap+jquery 数据库文件(可选) 文件夹中自带 依赖包文件(可选) maven管理的项目

    dwr入门+springmvc实现

    它的最新版本DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-logging日记操作. 其大概开发过程如下: 1.编写业务代码,该...

    基于Java web SSM框架的高校运动会管理系统(源码+数据库+war发布包).zip

    该高校运动会信息管理系统是以B/S架构为设计基础并基于SSM框架开发的系统,系统以IntelliJ IDEA...spring+spring mvc+mybatis+bootstrap+jquery 数据库文件(可选) 文件夹中自带 依赖包文件(可选) maven管理的项目

    基于SSM框架ssm美好生活日志网.zip

    利用Spring、Spring MVC和MyBatis(即SSM)这三个主流的Java开发框架,该系统提供了个人日记、心情分享、生活技巧以及社区交流等功能。 系统的主要特点和功能可能包括: 1. **个性化日记本**:允许用户记录日常...

    毕设项目,同步用的.rar

    使用java编写代码,应用非常流行的spring mvc框架,引入ckeditor插件,并加入localStorage缓存技术,最终利用Eclipse完成。非常适合Java学习者用于练手。 4. 自己的Java编辑器 使用 Eclipse 开发,配合 Java 语言...

    SpringMVC大型项目源码

    SpringMVC+mysql大型项目源码,目前客户在使用的,适合初学者及开发者,有系统管理用户权限分配、机械管理、分页、视图、IReport等,使用了extjs。

    基于Maven+ssm+Mysql的日记管理项目.zip

    项目涉及到SSM( Spring + Spring MVC + MyBatis )框架、MySQL数据库、Layui、EasyUI等技术,适合毕设项目、课设作业。资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的...

    微信小程序宠物小程序+ssm.zip

    微信小程序“宠物小程序Ssm.zip”是一个基于Spring、Spring MVC和MyBatis(SSM)框架开发的微信小程序,专为宠物主人和宠物爱好者提供一个全方位的宠物服务平台。该项目结合了微信小程序的用户体验和SSM框架的技术...

    最新小程序宠物小程序+ssm.zip

    微信小程序“宠物小程序Ssm.zip”是一款基于Spring、Spring MVC和MyBatis(SSM)框架开发的小程序,专为宠物主人、宠物店以及宠物爱好者社区设计。该项目结合了微信小程序的广泛覆盖和便利性以及SSM框架的高效性能,...

    Day10实习日记1

    Day10实习日记1

Global site tag (gtag.js) - Google Analytics