注解型 SpringMvc 为基础的框架设计(一)

本贴最后更新于 2654 天前,其中的信息可能已经天翻地覆

关于现下流行的框架,自己做个整合,如果有想自己写个框架的,可以参考下,包含内容
1)MVC 框架(SpringMVC)
2)数据池(druid)
3)映射框架(hibernate) ---- 用 hibernate 做的映射,操作数据库采用 Hibernate+SpringJdbc 的方式
4)CSS 框架(bootstrap)
5)日志管理(slf4j+log4j)
6)缓存管理(oacache)
7)异常管理
8)AOP
9)注解声明式事务管理
10)伪静态页面(thymeleaf)
11)文件系统(Webservice)


一:注解型 SpringMVC

我们先来说说 MVC 的概念:浏览器发送请求,核心控制器参考配置文件将各个请求分配给不同的 action 去处理,在控制器把请求交给 action 去处理之前,会将请求参数封装成一个参数对象,参数对象获得后调用校验方法进行校验,通过后将对象传递给指定的方法,action 执行完后返回结果视图,通过路径解析关联到某个页面。

1 核心控制器

web 程序入口在 web.xml,配置 DispatcherServlet,相当于 struts2 的 FilterDispatcher,也是作为 Spring 的入口,所有*.action 的请求都会进入这个调度器分发执行,他是负责流程控制(职责调度)的一个 Servlet,他同时会把 default.xml 下的 bean 实例化到容器中。

  <servlet>  
      <servlet-name>spring</servlet-name>  
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
      <init-param>  
          <param-name>contextConfigLocation</param-name>  
          <param-value>/WEB-INF/default.xml</param-value>  
      </init-param>  
      <load-on-startup>1</load-on-startup>  
  </servlet>  
  <servlet-mapping>  
      <servlet-name>spring</servlet-name>  
      <url-pattern>*.action</url-pattern>  
  </servlet-mapping>

Spring4 下程序可继承 WebApplicationInitializer 随容器一起启动

@Configuration
public class ViewConfig extends WebMvcConfigurerAdapter

ServletRegistration.Dynamic registration = 
  servletContext.addServlet("dispatcher", new DispatcherServlet(webContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");

因为 maven 打包 web 项目会去找 web.xml 文件,此时去掉 web.xml 后需要配置 maven 打包插件,添加 failOnMissingWebXml 属性

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-war-plugin</artifactId>
	<version>2.3</version>
	<configuration>
		<warName>${war-name}</warName>
		<failOnMissingWebXml>false</failOnMissingWebXml>
	</configuration>
</plugin>

注:之后所有的配置均采用零配置文件的方式,不会把 xml 配置文件和 java 配置文件都写出来

初始化 DispatcherServlet 会把 Bean 实例化到容器中,我们采用注解的方式注明哪些 Bean 需要实例化

@Configuration
@ComponentScan(basePackages = {
	"com.es.*"
})
public class WebConfig extends WebMvcConfigurationSupport

2 参数对象 + 结果视图

bean 初始化之后,请求根据转向路径进入不同的 action,在控制器把请求交给 action 去处理之前,会将请求参数封装成一个参数对象,在 spring 里面就是一个 ModelAndView 对象(spring 参数对象颇多,此处先用 ModelAndView 做例,下面会详细介绍),用来替代 struts2 繁琐的属性封装,ModelAndView=model+view,model 就是他作为容器和页面共享数据的意思(其实他们都相当于一个参数对象的 map 而已),view 是指 Action 执行完后要返回的结果视图,当然这个视图和 struts2 一样也可以是一个字符串,再通过路径解析找到页面

对转向页面的路径解析(结果视图解析):

@Bean
public ViewResolver getViewResolver(ContentNegotiationManager manager){
	logger.info("ViewResolver");
	ContentNegotiatingViewResolver bean = new ContentNegotiatingViewResolver();
	bean.setContentNegotiationManager(manager);
	List<ViewResolver> viewResolvers = new ArrayList<ViewResolver>();
	viewResolvers.add(new BeanNameViewResolver());
	//viewResolvers.add(new XmlViewResolver());
	viewResolvers.add(new JsonViewResolver());
	
	InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();
	jspViewResolver.setPrefix("/jsp/");
	jspViewResolver.setSuffix(".jsp");
	viewResolvers.add(jspViewResolver);
	bean.setViewResolvers(viewResolvers);
	return bean;
}
  @Controller  
  public class MainAction {  
      @RequestMapping("/mainPage")  
      //如果你要返回一个string作为结果视图,那么你需要把一个modelMap作为参数,把对象共享在容器中  
      public String mainPage(HttpServletRequest request,ModelMap modelMap) {  
          String message = request.getParameter("message");  
          modelMap.addAttribute("message",message);  
          return "main/main";  
      }  
        
      @RequestMapping("/mainPage1")  
      //如果你返回一个ModelAndView那么把共享的对象放在ModelAndView里面(此时没有路径解析)  
      public ModelAndView mainPage1(HttpServletRequest request) {  
          String message = request.getParameter("message");  
          ModelMap modelMap = new ModelMap();  
          modelMap.addAttribute("message",message);  
          return new ModelAndView("forward:jsp/main/main.jsp",modelMap);  
      }  
  }

在页面上接收 message 直接采用 ${message}即可。
由此为止,一个请求到处理结束的转发均已完成,也就是一个 MVC 的完成。
之后写数据池、hibernate 映射和操作数据库。

  • 设计
    113 引用 • 797 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...