搭建环境
1.配置前段控制器wen.xml
<!-- POOST提交下的Respone 编码 --> <filter> <filter-name>encoding</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> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <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.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
注意:注解申明的url可以不加后缀名,前段控制器dispatcherServlet会自动默认加上的
但是我们在访问的时候,访问路径必须加上web.xml前段控制器配置的后缀,不然前段控制器不识别
2.配置springmvc.xml
2.1配置注解扫描包(注解方式)
<context:component-scan base-package="com.fyh.www.controller" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
这里配置com.fyh.www.controller包下只扫描@Controller注解
applicationContext.xml的配置方式如下,一般不扫描@Controller注解
<context:component-scan base-package="com.fyh.www" > <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
2.2配置处理器映射器和处理器适配器
默认注册了注解映射器和注解适配器
<mvc:annotation-driven />
如果配置转换器,这里要注册转换器(可选)
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 设置Converter转换器 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <!-- 设置多个转换器 --> <property name="converters"> <list> <bean class="com.fyh.www.common.mvcConverter.CustomTrimConverter"></bean><!-- 去除前后空格 --> </list> </property> </bean>
去除前后空格转换器代码实现如下
package com.fyh.www.common.mvcConverter; import org.springframework.core.convert.converter.Converter; public class CustomTrimConverter implements Converter<String, String> { //转换过程 public String convert(String source) { // TODO Auto-generated method stub try { if(null != source){ source = source.trim(); // "" if(!"".equals(source)){ return source; } } } catch (Exception e) { // TODO: handle exception } return null; } }
2.3配置视图解析器
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
2.4配置上传(可选)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="1048576"/> </bean>
2.5配置拦截器(可选)
<!-- Springmvc拦截器 --> <mvc:interceptors> <!-- 配置多个 --> <mvc:interceptor> <mvc:mapping path="/*/**"/> <bean class="com.fyh.www.common.interceptor.MvcInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
例如在访问/buyer路径必须登录的拦截器代码实现如下
package cn.itcast.core.interceptor; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import cn.itcast.common.utils.RequestUtils; import cn.itcast.core.service.user.SessionProvider; /** * Controller == Springmvc Handler * 拦截器 * @author lx * */ public class CustomHandlerInterceptor implements HandlerInterceptor{ @Autowired private SessionProvider sessionProvider; //拦截的请求规则 public static final String URL_INTERCEPTOR = "/buyer"; //方法前 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub //4.1 判断用户是否 /buyer开始不能放行 //请求路径 // uri /buyer/trueBuy.shtml // url http://localhost:8081/buyer/trueBuy.shtml String requestURI = request.getRequestURI(); if(requestURI.startsWith(URL_INTERCEPTOR)){ //必须登陆 //判断用户是否登陆 String username = sessionProvider.getAttributeForUserName(RequestUtils.getSessionID(request, response)); if(null != username){ request.setAttribute("isLogin", true); }else{ request.setAttribute("isLogin", false); //重定向登陆页面 response.sendRedirect("http://localhost:8083/shopping/login.aspx?returnUrl=" + URLEncoder.encode(request.getParameter("returnUrl"),"UTF-8")); return false; } }else{ //可登可不登陆 //判断用户是否登陆 String username = sessionProvider.getAttributeForUserName(RequestUtils.getSessionID(request, response)); if(null != username){ request.setAttribute("isLogin", true); }else{ request.setAttribute("isLogin", false); } } //放行 return true; } //方法后 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } //页面渲染后 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }
转发和重定向
1.Springmvc中重定向使用:redirect
在本类中进行转发:redirect:hello.do
跨类进行转发:redirect:/param/add.do
@RequestMapping("/toadd") public String toAdd(){ return "redirect:/param/add.action"; }
2.转发:forward
在本类中进行转发:forward:hello.do
跨类进行转发:forward:/param/add.do
@RequestMapping("/toadd") public String toAdd(){ return "forward:/param/add.action"; }
请求json数据返回json数据
1.环境
需要注册json转换器,如果开启注解驱动,json转换器不用配置
需要引入jar包(注意高低版本引入的jar包是不一样的)
2.@RequestBody @ResponseBody实现json数据交互
public @ResponseBody User LoginController(@RequestBody User user){
解决中文乱码
1.post请求的中文乱码
在web.xml文件中加入编码过滤器
<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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
2.get请求的中文乱码
方式一:修改tomcat配置文件server.xml修改编码与工程编码一致
<Connector connectionTimeout="20000" URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
方式二:对参数进行重新编码
username = new String(request.getParameter("username").getBytes("ISO8859-1"),"UTF-8");
请求数据绑定
1.支持默认的参数类型
HttpServletRequest request
HttpServletResponse response
HttpSession session
Model model
model是向页面传递数据,如下
public String LoginController(HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model){ User user = new User(); model.addAttribute("user",user); return null; }
页面通过${user.xxx}获取user的属性值
2.@RequestParam(将请求参数的值传给形参)
public String LoginController(@RequestParam(value="myid",defaultValue="3",required=true) Integer id,Model model)
3.@PathVariable (将请求路径的值传给形参)
@RequestMapping("/login/{groupId}/{userId}") public String LoginController(@PathVariable int groupId,@PathVariable int userId,Model model){
l 基本数据类型可以根据名称对应直接传递给形参
l 引用数据类型pojo提供set/get自动封装
l 集合.数组可以根据名称对应直接封装