第一步:导入包
aopalliance-1.0.jar
aspectjweaver-1.8.13.jar
commons-logging-1.2.jar
javax.servlet-api-3.1.0.jar
jstl-1.2.jar
spring-aop-3.2.13.RELEASE.jar
spring-beans-3.2.13.RELEASE.jar
spring-context-3.2.13.RELEASE.jar
spring-core-3.2.13.RELEASE.jar
spring-expression-3.2.13.RELEASE.jar
spring-web-3.2.13.RELEASE.jar
spring-webmvc-3.2.13.RELEASE.jar
第二步:配置文件springmvc-servlet.xml配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置处理器映射 HandlerMapping.使用了注解就可以不用这个了,因为不用注解这里需要配置多个,controller类也不用继承AbstractController接口了-->
<!--<bean name="/hello.html" class="cn.kgc.controller.HelloController"/>-->
<!-- html视图解析器 必须先配置freemarkerConfig,注意html是没有prefix前缀属性的-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--模板路径,相当于前缀-->
<property name="templateLoaderPath">
<value>/WEB-INF/htmls/</value>
</property>
</bean>
<bean id="htmlviewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="cache" value="true"/>
<!--后缀,没有前缀属性-->
<property name="suffix" value=".html" />
<!--优先级别,越小级别越高-->
<property name="order" value="1"/>
</bean>
<!--XmlViewResolver视图解析器-->
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location" value="classpath:view.xml"/>
<property name="order" value="0"/>
</bean>
<!--配置视图解析器,不同包可以建多个解析器,viewNames:视图名以jpg开头的。-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="application/xml"/>
<property name="viewNames" value="htmls*"/>
<!--前缀-->
<property name="prefix" value="/WEB-INF/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
<property name="order" value="2"/>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="viewNames" value="jsp*"/>
<!--前缀-->
<property name="prefix" value="/WEB-INF/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
<property name="order" value="3"/>
</bean>
<!--开启注解,4.1.2以上高版本自动开启-->
<context:annotation-config/>
<!-- 配置扫描注解的包 -->
<context:component-scan base-package="cn.kgc.controller,cn.kgc.pojo" />
<!-- 注册HandlerMapper、HandlerAdapter两个映射类,解决@Controller注解的使用前提配置,否则DispatcherServlet无法找到控制器并把请求分发到控制器。 -->
<!--<mvc:annotation-driven/>-->
<!-- 访问静态资源,让静态资源文件不经过控制器,主要用第二种 -->
<!--<mvc:default-servlet-handler default-servlet-name="/statics/"/>-->
<!--静态资源默认用servlet配置-->
<mvc:default-servlet-handler/>
<!-- 访问静态资源,mapping:将静态资源映射到指定的路径下;location:本地静态资源文件所在的目录 -->
<mvc:resources mapping="/statics/**" location="/statics/"/>
<!--拦截器,新建拦截器DetailInterceptor类,继承HandlerInterceptor接口,实现方法-->
<!--可以配置多个-->
<mvc:interceptors>
<mvc:interceptor>
<!--表示匹配指定路径的请求才进行拦截,拦截detail开头的所有路径-->
<mvc:mapping path="/detail/*"/>
<bean class="cn.kgc.myinterceptor.DetailInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--表示匹配指定路径的请求才进行拦截,拦截所有路径-->
<mvc:mapping path="/**"/>
<bean class="cn.kgc.myinterceptor.Interceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!--下面的看情况配置-->
<!-- 自定义格式转换器 -->
<bean id="myConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--引入多个自定义的转换器-->
<property name="converters">
<list>
<!--引入自定义的StringToDateConverter转换器-->
<bean class="cn.kgc.tools.StringToDateConverter">
<!--构造注入字符串日期格式-->
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
</bean>
</list>
</property>
</bean>
<!--<bean class="cn.kgc.pojo.UserValidator" id="userValidator"/>-->
<!-- conversion-service="myConversionService,指定自定义转换器覆盖默认的转换器,
就不需要在javaBean日期属性上用@DateTimeFormat(pattern = "yyyy-MM-dd")注解了 -->
<mvc:annotation-driven conversion-service="myConversionService">
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!--设置消息处理器的编码格式-->
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<!--设置日期的编码格式-->
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--全局异常的配置-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--定义默认的异常处理页面为error.jsp-->
<property name="defaultErrorView" value="jsp/error"/>
<!--定义异常处理页面用来获取异常信息用 ex. 变量名获取, 默认名为:exception-->
<property name="exceptionAttribute" value="ex"/>
<!--定义需要特殊处理的异常-->
<property name="exceptionMappings">
<props>
<!--RuntimeException:运行异常,myerror:视图名,用hello.jsp页面显示异常信息,在页面用${ex.message}获取异常信息-->
<prop key="java.lang.RuntimeException">jsp/myerror</prop>
<!--自定义类异常-->
<prop key="cn.kgc.exception.MyException">jsp/myerror</prop>
</props>
</property>
</bean>
<!--配置MultipartResolver,用于文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件大小上限-->
<property name="maxInMemorySize" value="5000000"/>
<!--请求编码格式-->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!--字符国际化-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="useCodeAsDefaultMessage" value="true"/>
</bean>
<mvc:interceptors>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptors>
<!--将语言信息设置到Session中,这样整个系统就可以获得语言信息-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<!--如果没有Session,就用zh_CN-->
<property name="defaultLocale" value="zh_cn"/>
</bean>
<!--将语言信息设置到Cookie中,这样整个系统就可以获得语言信息-->
<!--<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">-->
<!--<!–Cookie实效时间120秒–>-->
<!--<property name="cookieName" value="language"/>-->
<!--<property name="cookieMaxAge" value="120"/>-->
<!--<!–如果没有Cookie,就用zh_CN–>-->
<!--<property name="defaultLocale" value="zh_CN"/>-->
<!--</bean>-->
</beans>
第三步:配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<!--2.4版本以上可以不用加er语句,也能认到er表达式-->
<web-app>
<!--给上下文传参数(这个会在Action里面用到),web服务启动时加载的xml文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:mybatis-spring.xml
</param-value>
</context-param>
<!--加入一个监听器,在服务一启动的时候把Spring的配置文件的mybatis-spring.xml读取,以后不用每执行一次方法都读取xml文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--springMvc核心控制器的配置DispatchServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / 拦截所有的URL请求-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第四步:创建Controller(处理请求的控制器,也就是servlet)
创建Controller层
新建控制类
@Controller
@RequestMapping("/user") // "/user" 访问URL
public class IndexController extends BasDao {
private Logger logger=Logger.getLogger(IndexController.class);
// "/user/hello" 访问URL
@RequestMapping("/hello")
public ModelAndView index(HttpServletRequest request){
ApplicationContext context=getApplicatIonContext(request);
DetailService dsi=(DetailService)context.getBean("detailServiceImpl");
int i=dsi.count();
logger.info("调用:index 方法,参数:null,执行结果:"+i);
return new ModelAndView("hello"); //返回逻辑视图名,hello.jsp页面
}
@RequestMapping(value = "/hello1",method = RequestMethod.GET,params = "username") //value:请求URL,method:请求方式,params:请求参数
public String welcome(@RequestParam(required = false,value = "username") String username,HttpServletRequest request){ //value:参数别名,可以省略,required:是否必须
ApplicationContext context=getApplicatIonContext(request);
DetailService dsi=(DetailService)context.getBean("detailServiceImpl");
int i=dsi.count();
logger.info("调用:index 方法,参数:"+username+",执行结果:"+i);
return "hello"; //转发
//return "redirect:/user/hello"; //重定向
}
@RequestMapping("/index1")
public ModelAndView index(@RequestParam(defaultValue = "10",required = false) Integer age, String username,HttpServletRequest request){ //不给@RequestParam注解,url参数可给可不给,不给赋null值。但只能是引用类型或者包装类型
//defaultValue=“10”:如果不给url参数赋值,就给赋指定值10,
ApplicationContext context=new ClassPathXmlApplicationContext("mybatis-spring.xml");
DetailService dsi=(DetailService)context.getBean("detailServiceImpl");
int i=dsi.count();
ModelAndView mav=new ModelAndView();
mav.addObject("username",username+age); //把参数传送到前段
mav.setViewName("hello"); //用那一个页面显示
logger.info("调用:index 方法,参数:"+username+",执行结果:"+i);
return mav;
}
@RequestMapping("/index2")
public String index2(String username, Model model){
ApplicationContext context=new ClassPathXmlApplicationContext("mybatis-spring.xml");
DetailService dsi=(DetailService)context.getBean("detailServiceImpl");
int i=dsi.count();
model.addAttribute("username",username); //给 model添加数据,直接在前断显示
logger.info("调用:index 方法,参数:"+username+",执行结果:"+i);
return "hello";
}
}
第五步:创建jsp视图
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@page isELIgnored="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Title</title>
<link rel="stylesheet" type="text/css" href="/chun/statics/css/comm.css"/>
</head>
<body>
<h1>${username}123456</h1>
语言选择:
<a href="?lang=zh_CN"><spring:message code="language.cn"/></a>
<a href="?lang=en_US"><spring:message code="language.us"/></a>
<h1><spring:message code="zsc"/></h1>
<h2><fmt:message key="zsc"/></h2>
<h3>${msg}</h3>
当前语言: ${pageContext.response.locale }
<img src="/chun/statics/images/ccc.jpg">
<c:out value="value" default="1" escapeXml="true"/>
<c:forEach var="名称" items="集合对象" varStatus="index索引号">
</c:forEach>
<c:if test="条件" var="varName" scope="request">
</c:if>
<fmt:formatDate value="date" pattern="yyyy-MM-dd"/>
</body>
</html>
第六步:部署服务器运行