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

  • 相关阅读:
    QR码与DM码的对比
    JBPM在Eclipse中运行时页面错误ProcessEngine cannot be resolved to a type
    C. A Mist of Florescence
    B. A Tide of Riverscape
    A. A Blend of Springtime
    A. Gennady the Dentist
    D. Lizard Era: Beginning
    E. Jzzhu and Apples
    D. Jzzhu and Cities
    C. Jzzhu and Chocolate
  • 原文地址:https://www.cnblogs.com/woms/p/6037489.html
Copyright © 2020-2023  润新知