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