从spring到springmvc到springboot到springcloud(四)

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的意思,哪个好哪个坏呢?我也不知道。看个人喜好吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值