zoukankan      html  css  js  c++  java
  • spring mvc

    一、spring jar

    核心包 MVC AOP 日志相关 数据库相关
    spring-aop-4.3.9.RELEASE.jar spring-web-4.3.9.RELEASE.jar aspectjweaver-1.8.10.jar commons-logging-1.1.1.jar spring-tx-4.3.9.RELEASE.jar
    spring-beans-4.3.9.RELEASE.jar spring-webmvc-4.3.9.RELEASE.jar log4j-1.2.17.jar spring-jdbc-4.3.9.RELEASE.jar
    spring-context-4.3.9.RELEASE.jar
    spring-core-4.3.9.RELEASE.jar
    spring-expression-4.3.9.RELEASE.jar

    二、spring-MVC配置

    • web.xml文件中的配置
    <!-- web.xml文件中的配置 -->
    <!--配置核心控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--初始化参数指定springMVC的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--tomcat启动时初始化servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!--配置编码过滤器-->
        <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>/*</url-pattern>
        </filter-mapping>
    
    • Spring-MVC配置
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置前缀 -->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!-- 配置后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
    

    三、java中的使用

    1.获取请求参数
    @Controller
    public class Hello {
        //请求映射
        @RequestMapping("/hello")
        public String helloword(){
            //拼接上spring-MVC配置文件中的前缀和后缀
            return "hello";
        }
    }
    @RequestMapping("/hello")
    /**
     * 接受参数
     * @RequestParam 注解贴在形参的前面
     *  value:参数的名称 default 形参的name
     *  required:参数是否为必须的 有@RequestParam注解时 默认值是true(不传参会报错,当有defaultValue时不会报错) 没有注解时传不传都行
     *  defaultValue :参数的默认值 没有传参时使用默认值 ; age=  传参却为空时是null 或""(String);
     */
    public String paramTest(String name,@RequestParam(required = true)Integer age){
        System.out.println("name = [" + name + "], age = [" + age + "]");
        return "hello";
    }
    
    /**
     * 当返回的参数数值为空串时: String显示"";基本数据类型会报错;其他数据类型会显示null
     * 当返回的参数中没有pojo类中的数据时:String类型是"null"基本数据类型会显示各自的默认值;其他数据类型会显示null
     */
    @RequestMapping("/pojo")
    public String PojoTest(Person person){
        System.out.println("person = [" + person + "]");
        System.out.println("-"+person.getName()+"-");
        return "hello";
    }
    
    2.设置响应信息
    @RequestMapping("test1")
    public ModelAndView test1(String name,Integer age){
        //创建模型视图对象
        ModelAndView m = new ModelAndView();
        //指定视图
        m.setViewName("hello");
        //添加模型对象 (设置到 request作用域中)
        m.addObject("name",name);
        m.addObject("age",age);
        return m;
    }
    @RequestMapping("test2")
    //直接在参数列表中创建Map (设置Map到 request作用域中)
    public String test2(String name,Integer age,Map<String,Object> map){
        map.put("name",name);
        map.put("age",age);
        return "hello";
    }
    
    3.文件的上传
    @RequestMapping("file")
        public String testFile(HttpServletRequest request, MultipartFile file) throws IOException {
            //获取文件的io流
            InputStream is = file.getInputStream();
           //获取文件名
            String fileName = file.getOriginalFilename();
            String [] strs = fileName.split("\.");
            if(strs.length>=2){
                fileName = UUID.randomUUID()+"."+strs[strs.length-1];
            }else{
                fileName = UUID.randomUUID()+"";
            }
            //获取项目的决定路径
            String savePath = request.getServletContext().getRealPath(File.separator+"upload");
            //创建文件对象UUID.randomUUID() 保证文件名唯一
            File saveFile = new File(savePath+File.separator + fileName);
            //查看目录是否存在
            if(!saveFile.getParentFile().exists()){
                //创建文件的目录
                saveFile.getParentFile().mkdir();
            }
            //创建输出流对象
            FileOutputStream out = new FileOutputStream(saveFile);
            //copy文件 使用工具类需要导包commons-io-2.5.jar
            IOUtils.copy(is,out);
           /*byte[] b = new byte[1024];
            int n=0;
            while((n=is.read(b))!=-1){
                out.write(b, 0, n);
            }
    
            is.close();
            out.close();*/
    
            return "hello";
        }
    
    <!--文件上传 spring-mvc.xml文件配置-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    
    </bean>
    
    4.处理异常
    //@ControllerAdvice注解可以使全局的异常都转发到error页面 而不用每个controller都定义一个处理异常的方法
    @ControllerAdvice
    public class ErrorContreller {
        //被@ExceptionHandler标注的类只能有异常类型的参数;@ExceptionHandler({Throwable的子类的数组})
        @ExceptionHandler
        public ModelAndView exception(Exception e){
            ModelAndView m = new ModelAndView("error");
            m.addObject("exception",e);
            return m;
        }
    }
    

    四、springMVC编码拦截器的配置

    <!--配置编码过滤器-->
    <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>/*</url-pattern>
    </filter-mapping>
    

    五、spring-MVC类型转换器

    1.简单类型不需要自定义类型转换器
    1. String-->Date @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date
    2. String-->number @NumberFormat(pattern = "#,###") int number
    2.java 自定义类型转换器
    /**
     * 自定义类型转换器
     *  实现Converter接口
     *  - 第一个泛型参数:原类型
     *  - 第二个泛型参数:目标类型
     */
    @Component
    public class StringBookConverter implements Converter<String,Book> {
        @Override
        public Book convert(String s) {
            String[] strs = s.split("-");
            return new Book(strs[0],strs[2]);
        }
    }
    

    配置类型转换器

    <mvc:annotation-driven conversion-service="conversionService"/>
    
    <!--配置类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" >
        <property name="converters">
            <set>
                <!-- 自定义的类型转换器 -->
                <ref bean="stringBookConverter"/>
            </set>
        </property>
    </bean>
    

    六、加载静态资源

    <!--使用默认的servlet处理 可以加载静态资源 只配置default-servlet-handler 会使spring-mvc请求找不到 需要配合下面的设置-->
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven />
    <!-- 
    <mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,
    这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,
    @NumberFormatannotation支持;
    @DateTimeFormat支持;
    @Valid支持读写XML的支持(JAXB);
    读写JSON的支持(默认Jackson)等功能。
     -->
    

    七、拦截器的配置

    <!-- 配置拦截器 -->
    <mvc:interceptors>
    <!-- 拦截全部 -->
        <ref bean="firstInterceptors"/>
    <!-- 拦截指定的类型 *:代表一级目录 ; **:代表任意级目录-->
        <mvc:interceptor>
            <mvc:mapping path = "/x/**"/>
            <ref bean="firstInterceptors"/>
        </mvc:interceptor>  
        
    </mvc:interceptors>
    
    /**
    *方法执行的流程
    *  当preHandle返回的是true时
    *      preHandle-->servletf发-->postHandle-->afterCompletion
    * 当preHandle返回的是false时 只执行 preHandle
    */
    @Component
    public class FirstInterceptors  implements HandlerInterceptor{
        @Override
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            System.out.println("FirstInterceptors.preHandle");
            //返回是true放行;false拦截
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("FirstInterceptors.postHandle");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("FirstInterceptors.afterCompletion");
        }
    }
    
  • 相关阅读:
    程序从命令行接收多个数字,求和之后输出结果。
    动态规划(1)
    软件工程个人作业(4)
    冲刺2 01
    构建之法
    水王
    大道至简第七章读后感
    构建之法03
    团队冲刺第四天
    团队冲刺第三天
  • 原文地址:https://www.cnblogs.com/yuing/p/8966915.html
Copyright © 2011-2022 走看看