Spring里面最重要的概念是IOC和AOP,还有两项很重要的模块是事务和MVC,对于IOC和AOP,我们要深究其源码实现,对于事务,我们务必理解。对于MVC,Spring MVC提供的功能很多、很先进,但我们一般只要用其中的一小部分就可以满足我们的开发需求,另外,我们并不建议你排斥Struts2,因为它也是经过无数公司验证过的优秀的框架。本文给出spring mvc简单配置和部分代码举例。
WEB-INF/web.xml
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <display-name>ixhong-admin-web</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-velocity.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>*.xyz</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.html</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/404_error.html</location> </error-page> </web-app>
WEB-INF/velocity-tools.xml
<toolbox> <tool> <key>stringUtils</key> <scope>application</scope> <class>org.apache.commons.lang.StringUtils</class> </tool> <tool> <key>dateFormatUtils</key> <scope>application</scope> <class>org.apache.commons.lang.time.DateFormatUtils</class> </tool> <tool> <key>escapeUtils</key> <scope>application</scope> <class>org.apache.commons.lang.StringEscapeUtils</class> </tool> </toolbox>
spring-velocity.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd" default-autowire="byName"> <!-- --> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name = "supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <context:component-scan base-package="com.architectj.admin.web.controller"/> <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/vm"/> <property name="configLocation" value="classpath:velocity.properties"/> </bean> <!-- 上传数据大小 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="5242880"/><!-- 最大5M --> </bean> <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> </bean> <bean id="exceptionResolver" class="com.architectj.admin.web.ExceptionHandler"/> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"> <property name="suffix" value=".vm"/> <property name="layoutUrl" value="layout/default.vm"/> <!-- 使用springMacro、使用servlet的对象 --> <property name="exposeSpringMacroHelpers" value="true"/> <property name="exposeRequestAttributes" value="true"/> <property name="exposeSessionAttributes" value="true"/> <property name="contentType" value="text/html;charset=UTF-8"/> <!-- spring的日期格式化 --> <property name="dateToolAttribute" value="dateTool"/> <property name="toolboxConfigLocation" value="/WEB-INF/velocity-tools.xml"/> <property name="attributesMap"> <map> </map> </property> </bean> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/**" /> <mvc:mapping path="/teacher/**"/> <bean class="com.architectj.admin.web.interceptor.LoginInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/user/**" /> <mvc:mapping path="/teacher/**"/> <bean class="com.architectj.admin.web.interceptor.SecurityInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/user/**"/> <mvc:mapping path="/teacher/**"/> <bean class="com.architectj.admin.web.interceptor.PermissionInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>
velocity.properties
#encoding input.encoding=UTF-8 output.encoding=UTF-8 contentType=text/html;charset=UTF-8 #autoreload when vm changed resource.loader=file file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader file.resource.loader.cache=false file.resource.loader.modificationCheckInterval=1 velocimacro.library.autoreload=true velocimacro.library=macro.vm
macro.vm
#macro(pagination $targetUrl $queryResult) <div id="kkpager"></div> <script type="text/javascript" src="/lib/kkpager.min.js"></script> <script type="text/javascript"> //init $(function(){ //生成分页 //有些参数是可选的,比如lang,若不传有默认值 kkpager.generPageHtml({ //当前页码 pno : $!{query.currentPage}, //总页码 total : $!{queryResult.totalPage}, //总数据条数 totalRecords : $!{queryResult.amount}, //链接前部 hrefFormer : '$targetUrl', //链接尾部 hrefLatter : '', getLink : function(n){ if (n == 1){ return this.hrefFormer; } return this.hrefFormer + "&page="+n; } }); }); </script> #end
LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 解析cookie得到source UserDO user = this.decoder(source); LoginContext context = new LoginContext(); context.setUser(user); LoginContextHolder.set(context); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if(modelAndView != null) { modelAndView.addObject("xxx",LoginContextHolder.getLoginUser()); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { LoginContextHolder.clear(); } protected UserDO decoder(String content){ // ... return user; } }
SecurityInterceptor
public class SecurityInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { LoginContext loginContext = LoginContextHolder.get(); if(loginContext != null && loginContext.getUser() != null) { return true; } response.sendRedirect("/login.xyz");//登陆 return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
Controller
@Controller public class IndexController extends BaseController{ @Autowired private AdminService adminService; @RequestMapping("/login") public ModelAndView login(HttpServletRequest request,HttpServletResponse response) { ModelAndView mav = new ModelAndView(); if (LoginContextHolder.getLoginUser() != null){ mav.setViewName("redirect:/yyy/list.xyz"); } return mav; } @RequestMapping(value = "xxxxxx", method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public String loginAction(@RequestParam("name") String name, @RequestParam("password") String password, @RequestParam("code") String code, HttpServletRequest request,HttpServletResponse response) { if(LoginContextHolder.getLoginUser() != null){ Result result = new Result(); result.setSuccess(true); return ResultHelper.renderAsJson(result); } //验证码校验 // ... Result result = this.adminService.login(name.trim(), password); // ... return ResultHelper.renderAsJson(result); } }
附:velocity注释是 ## 注释掉的东西不会再html源码里显示,而<!--会显示,模版引擎/编译器会做忽略的事情,HTML的注释不会忽略
相关推荐
Spring MVC、MyBatis 和 Velocity 是三个在Java Web开发中广泛应用的开源框架。Spring MVC 是Spring框架的一部分,用于构建高效、灵活的Web应用程序。MyBatis 是一个优秀的持久层框架,它支持定制化SQL、存储过程...
在Spring MVC的配置文件(如`spring-mvc.xml`)中,你需要配置VelocityViewResolver,这是Spring MVC用来解析Velocity模板的类。设置其prefix和suffix属性,分别指定视图前缀和后缀,例如: ```xml ...
2. **配置Spring MVC**:在Spring的配置文件中,配置Spring MVC的DispatcherServlet,并设置视图解析器为VelocityViewResolver,指定Velocity模板文件的路径。 3. **配置Sitemesh**:在web.xml中配置Sitemesh的...
基于 Spring Spring MVC Spring Boot MyBatis Velocity Shiro 的 WeW
在IT行业中,构建高效、可维护的Web应用是至关重要的,而Maven、Spring MVC、Velocity和MyBatis是实现这一目标的四个关键组件。本文将深入探讨如何使用这些技术来搭建一个完整的Web应用程序。 首先,Maven是Apache...
在Spring的配置文件(如`applicationContext.xml`)中,定义视图解析器,通常使用`InternalResourceViewResolver`,并设置前缀和后缀,使得Spring MVC能够找到Velocity模板。 接下来,配置Velocity。在`web.xml`中...
1. **创建Maven项目**:首先,我们需要创建一个新的Maven项目,配置pom.xml文件,添加Spring MVC、Mybatis、Velocity以及它们依赖的其他库。 2. **配置Spring MVC**:在src/main/webapp/WEB-INF下创建spring-...
在这个整合实例中,开发者可以学习到如何设置Maven的POM.xml文件来管理所有依赖,如何配置Spring MVC的DispatcherServlet和ApplicationContext,如何定义Mybatis的Mapper接口和XML配置文件,以及如何在Velocity模板...
本示例项目" Maven + Spring MVC + Mybatis + Velocity + 国际化配置 Demo"提供了一种实用的方法来实现这一目标。以下将详细讲解这个整合实例中的各个关键组件及其相互作用。 1. Maven:Maven 是一个项目管理工具,...
配置Spring MVC通常涉及web.xml文件中的DispatcherServlet配置,以及Spring配置文件中定义的Controller、ViewResolver和其他组件。Spring Boot简化了这一过程,通过自动配置和@SpringBootApplication注解可以快速...
11. **MVC配置**: 传统的XML配置方式逐渐被Java-based配置和注解配置取代,简化了配置过程,使得Spring MVC应用更易维护。 12. **RESTful风格**: Spring MVC 支持创建RESTful API,通过@RequestMapping配合HTTP动词...
1. **添加依赖**: 在项目中引入SpringMVC和Velocity的相关库,通常包括`spring-webmvc`和`velocity`或者`velocity-tools`。 2. **配置SpringMVC**: 配置`DispatcherServlet`,指定处理器映射器、视图解析器等。对于...
9. **Tiles, FreeMarker, Velocity**: Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等,这些技术可以方便地构建动态网页。 10. **RESTful风格的支持**: Spring MVC通过@RequestMapping支持RESTful ...
本指南将深入探讨 Spring MVC 的核心概念、配置、控制器、数据绑定、视图解析以及实际应用中的最佳实践。 首先,我们来理解 MVC 设计模式。MVC 将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器...
6. **注解驱动开发**:Spring MVC允许使用注解来简化配置,如`@Controller`、`@RequestMapping`、`@Service`、`@Autowired`等,这些注解可以极大地减少XML配置文件的复杂性,提高代码的可读性和可维护性。...
通过策略接口,Spring MVC 具有高度可配置性,支持多种视图技术,如 JSP、Velocity、Tiles、iText 和 POI。 Spring MVC 的主要组成部分包括控制器、模型对象、分派器和处理程序对象,这些组件的职责明确,易于定制...
这是我写的一个Spring + Spring MVC + MyBatis + Velocity + MySQL 框架搭建完整项目,里面包含了所需的全部JAR包已经相关源码,感兴趣的同学可以下载喽。。。 配合我的博客更好哦!
通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring ...
这个jar文件包含Spring MVC框架相关的所有类。 包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。 当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的...
此外,Spring MVC支持多种视图技术,如JavaServer Pages (JSP)、Velocity模板引擎、Tiles布局管理器等。这一灵活性意味着Spring MVC不会限制开发者必须使用特定的技术栈,而是提供了一个统一的平台来支持不同的视图...