springmvc笔记

搭建环境

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  集合.数组可以根据名称对应直接封装

 

posted @ 2016-11-07 09:09  woms  阅读(458)  评论(0编辑  收藏  举报