从spring到springmvc到springboot到springcloud(四)

tech2026-06-22  1

Springmvc的基本构建方法xml、java

有两种配置springmvc的方式。首先新建一个Maven项目:

建好之后,打开pom.xml添加spring等需要的依赖包。

1 基于xml配置:

1.1、web.xml文件:

建好项目,打开webapp/WEB-INF/web.xml,添加内容。

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <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>

稍作解释: (1)

<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>

这是建立了spring的上下文监听器,它的作用之一是初始化bean,装配应用的上下文。

(2)

<servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <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,这个DispatcherServlet是关键。任何请求的第一步是经过spring的DispatcherServlet,注意是任何请求,一言蔽之,DispatcherServlet就是用来分发请求的意思了。DispatcherServlet的作用是将请求发送给Spring MVC控制器(controller),我在上一篇博客有FirstSpringMvc这个controller的源代码:

@Controller public class FirstSpringMvc { @Autowired UserService userService; @RequestMapping(value = "req1" , method = RequestMethod.GET) public String req1() { LinkedList<User> userList = (LinkedList<User>)userService.queryUsers(); for(User user: userList) { System.out.println(user.getName() + "\t身高:" + user.getHeight() + "cm\t体重:" + user.getWeight() + "kg\t国籍/所在地:" + user.getAddress()); } return "success"; } //……… }

DispatcherServlet怎么知道发送给哪一个控制器呢?所以会遍历的查系统中的处理映射器(handler mapping),来确定到底这个请求是“/req1“还是“/req2”还是其他。处理映射器(handler mapping)是根据请求的URL来确定的,这个好理解。一旦找到了合适的控制器,DispatcherServlet会将请求发送给选中的cotroller,然后处理此次请求的参数,转入处理方法执行。执行完毕之后,返回了view 和 model这是controller做的最后一件事了,接下来会将请求连同模型和视图名称再转给DispatcherServlet,DispatcherServlet调用视图的解析器(view resolver),来找到那个相匹配的视图渲染输出到页面(html、jsp等)。

如果没找到合适的控制器,浏览器会返回华丽的404!我会找个时间讨论如何处理404问题。

1.2、springmvc.xml:

<context:component-scan base-package="io.demo"></context:component-scan> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>

这里:

<context:component-scan base-package="io.demo"></context:component-scan>

是说要扫描io.demo包中的所有注解,那些@Bean、@Controller之类

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>

这定义了视图解析器InternalResourceViewResolver,里面的prefix、suffix分别是前缀和后缀。

1.3、applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id = "userDao" class="io.demo.dao.daoImpl.UserDaoImpl"></bean> <!-- 构造器方法注入 --> <!--<bean id = "userService" class="io.demo.service.serviceImpl.UserServiceImpl"> <constructor-arg> <ref bean="userDao"/> </constructor-arg> </bean> --> <!-- set 方法注入 --> <bean id = "userService" class="io.demo.service.serviceImpl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean> </beans>

这里是定义beans的,定义好了交给spring的应用上下文。

2 基于java文件配置

建好项目,

自己起个好些的项目名。 在pom.xml中引入jar包,有三个java文件是关键:

下面说这个。

2.1 ServletConfig.java

@Configuration @EnableWebMvc @ComponentScan("io.com.demo.noxml.web.controller") public class ServletConfig implements WebMvcConfigurer { //配置视图解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); resolver.setExposeContextBeansAsAttributes(true); return resolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/statics/**").addResourceLocations("/WEB-INF/statics/"); } }

它是spring容器的配置类。 注意io.com.demo.noxml.web.controller是要扫描controller注解的地方。@Configuration表示它本身是个配置类。@EnableWebMvc则注明了允许使用springmvc。里面的代码: @Bean public ViewResolver viewResolver(){………} 定义了视图解析器前后缀。下面的addResourceHandlers是定义了静态资源,我这边测试用的。这里是和springmvc.xml等效的。

2.2 SpringConfig.java

@Configuration @ComponentScan(value = "io.com",excludeFilters = {@Filter(type = FilterType.ANNOTATION,classes = {Controller.class})}) public class SpringConfig { }

这个是spring容器的配置类。

2.3 WebAppInitializer.java

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{ SpringConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] {ServletConfig.class}; } @Override protected String[] getServletMappings() { return new String[] {"/"}; } }

这是来初始化的。这里需要Servlet 3.0的支持呦。

不多做解释了,是跟上面的xml配置方式相对应的。把<bean id=”” ……>变成了@Bean的意思,哪个好哪个坏呢?我也不知道。看个人喜好吧。

最新回复(0)