开启 Spring & Spring MVC 之旅

简介: 不废话了,Spring 有多重要。首先是跑个 Hello World。Spring 最基本功能是 IOC,如果不懂或者好奇原理的可以参考《极简版 Java 依赖注射》。Hello World怎么获取 Spring?官方推荐 Maven 依赖管理(据说 Ant 也可以),也可以下载 Java 源码构建。

不废话了,Spring 有多重要。首先是跑个 Hello World。
Spring 最基本功能是 IOC,如果不懂或者好奇原理的可以参考《极简版 Java 依赖注射》

Hello World

怎么获取 Spring?官方推荐 Maven 依赖管理(据说 Ant 也可以),也可以下载 Java 源码构建。但本人比较追求好快多省,不喜欢加一坨坨多余的东西,就想直接下 jar 包。于是找到 http://repo.spring.io/release/org/springframework/


不知道下载哪些必要的包?没关系,先把 Hello World 代码贴进去,有报错的咱就去下载。

Hello World 程序一个三个文件,分别如下。

// hello/MessageService.java

package hello;

public interface MessageService {
    String getMessage();
}
// hello/MessagePrinter.java

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessagePrinter {

    final private MessageService service;

    @Autowired
    public MessagePrinter(MessageService service) {
        this.service = service;
    }

    public void printMessage() {
        System.out.println(this.service.getMessage());
    }
}
// hello/Application.java

package hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class Application {

    @Bean
    MessageService mockMessageService() {
        return new MessageService() {
            public String getMessage() {
              return "Hello World!";
            }
        };
    }

  public static void main(String[] args) {
      ApplicationContext context = 
          new AnnotationConfigApplicationContext(Application.class);
      MessagePrinter printer = context.getBean(MessagePrinter.class);
      printer.printMessage();
  }
}
缺的 jar 包大概如下(如果有新版本就下新版本),



基本上官方下载都齐了,另外依赖 Apache 日志接口,下载 http://commons.apache.org/proper/commons-logging/download_logging.cgi

这些就是运行 Spring Hello World 最基本的包了。Alt+Shift+X 运行下 Java 程序,成功运行结果如下。


虽然成功运行了,但 IDE 提示“Resource leak: 'context' is never closed”,怎么办?有人说用 Java 1.7 的 try 自动回收资源可以,但我试过不成功,于是改这个  ((ConfigurableApplicationContext) context).close(); 就 ok 了。

Spring MVC

MVC 需要 spring-web-4.2.4.RELEASE.jar、spring-webmvc-4.2.4.RELEASE.jar 包,还需要 AOP 的框架 aspectjweaver-1.6.10.jar 和 aopalliance-1.0.jar。

Spring MVC 仍旧与传统 Servlet MVC 那样配置 web.xml。当然新版 4.0 是可以作为 XML 零配置的,在 Java 里面使用注解就可以完成 XML 配置了(Servlet 3.0 开始都支持了)。

第一步,配置 web.xml 如下。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>MyServlet</display-name>

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/greeting</url-pattern>
    </servlet-mapping>
</web-app>
DispatcherServlet 继承自 HttpServlet 的,由它来分各种请求。每一个请求最先访问的都是 DispatcherServlet,DispatcherServlet 负责转发每一个 Request 请求给相应的Handler,Handler 处理以后再返回相应的视图(View)和模型(Model)。

该例子中我们指定了 /greeting 分发,对应执行哪个控制器呢?初始化 DispatcherServlet时会在 WEB-INF 目录中寻找一个名为 [servlet-名称]-servlet.xml 的文件,在那里执行对应的控制器。并且可以在那里定义相关的 Beans,重写在全局中定义的任何 Beans。

这个例子中是 springMVC-servlet.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-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/mvc     
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
     
    <bean name="/greeting" class="hello.web.GreetingController" /> 
     
    <!-- ViewResolver --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/> 
        <property name="suffix" value=".jsp"/> 
    </bean>
</beans>
GreetingController 源码如下:
package hello.web;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

public class GreetingController {

    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }

}

控制器 greeting 返回的字符串就是对应的模板文件,这一般是 jsp WEB-INF/spring-servlet.xml 配置文件中有 ViewResolver 视图控制器,所有不用我们指定模板所在目录和后缀名。

@RequestMapping 注解是 url 路径映射,可以多个。

整合 Spring

至今为止没有让 Spring IOC 和 Spring MVC 发生任何联系(貌似 MVC 可以脱离 Spring 本身独立使用,——这听上去有点不可思议)。事实上,MVC 基本可以不需要 Spring 其他繁杂的包,仅仅依赖下面这些包就可以工作了。


怎么让 Web 服务都受到 Spring IOC 容器管制呢?

在使用 Spring 容器的 web 应用中,业务对象间的依赖关系都可以用 context.xml 文件来配置,并且由 Spring 容器来负责依赖对象的创建。如果要在 servlet 中使用 Spring 容器管理业务对象,通常需要使用 WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()) 来获得 WebApplicationContext,然后调用 WebApplicationContext.getBean("beanName") 来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在 servlet 代码中硬编码了应用对象的 bean 名字。为了能在 servlet 中感知 Spring 中 bean,可采用如下步骤来实现:

http://www.open-open.com/lib/view/open1417248512252.html

官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

Spring MVC 用法笔记

为什么 Pojo 的 boolean 获取不到值?

如果你的字段名是 isOnline 以 is 开头的,要把 is 去掉,例如

	<div class="row">
		是否上线:<label>
		上线 <input type="radio" name="online" value="1" ${info.online ? 'checked' : ''} /> 
		</label>
		<label>
		下线 <input type="radio" name="online" value="0" ${info.online ? 'checked' : ''} />
		</label>
	</div>

value 用 1 或者 true 皆可。

目录
相关文章
|
6月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
321 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
6月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
487 0
|
6月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
300 0
|
6月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
265 0
|
6月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
204 0
|
2月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
183 0
|
2月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
112 0
|
2月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
154 0
|
8月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
363 29
|
9月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
201 4