• springMVC用法 以及一个简单的基于springMVC hibernate spring的配置


    替代struts

    1  web.xml中配置springmvc中央控制器

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>springmvc</display-name>
      
      <!-- SpringMVC中央控制器 -->
       <!--  Spring MVC 的Servlet,它将加载WEB-INF/mvc-servlet.xml 的  
        配置文件,以启动Spring MVC模块-->  
      <servlet>
          <servlet-name>mvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 代表在容器启动时就初始化,不写的时候代表在第一次请求的时候完成初始化,
            数字越小初始化越靠前-->
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>mvc</servlet-name>
        <!-- 在spring中要写/而不是/* -->
          <url-pattern>/</url-pattern>
      </servlet-mapping>
      
      
      
      
      <!-- Spring 容器启动监听器  -->
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!--spring服务层配置文件都放在以applicationContext开头的xml文件中,比如数据源 事务等-->
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:applicationContext*.xml</param-value>
      </context-param>
      
    
      
    </web-app>

    2

    web.xml 中定义了一个名为 mvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在
    WEB-INF/mvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。mvc-servlet.xml
    的配置内容如下所示:
    在WEB-INF建立xxx-servlet.xml 其中xxx代表 web.xml中的<servlet-name>mvc</servlet-name>
    名字一致,所以我们在这里建立mvc-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           <!-- 有一个用途是可以返回一个对象 ,其他的暂时不知道-->
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!-- 组件扫描 扫描springmvc的controller部分 -->
    <!--对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能-->
        <context:component-scan base-package="com.kaishengit.controller"/>
        <!-- 使用上面导入的schema/mvc  启用注解-->
        <mvc:annotation-driven/>
        
        <!-- 静态资源  **该目录及其子目录
      <img alt="" src="/static/image/kaola.jpg" width="300">
    --> <mvc:resources location="/static/" mapping="/static/**"/> <!-- 单纯的跳转,比如跳转到静态网页等 比如请求根的时候到index.jsp --> <mvc:view-controller path="/" view-name="index"/> <!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <!-- 让它支持jstl --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/views/"/> <!-- 后缀 --> <property name="suffix" value=".jsp"/> </bean> <!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 解析request的编码 ,Default is ISO-8859-1 --> <property name="defaultEncoding" value="UTF-8" /> <!-- 设置最大允许的大小(字节)。-1表示没有限制(默认) 1024*1024*10=10MB --> <property name="maxUploadSize" value="1048576000" /> <!--被允许的最大的内存的大小,Default is 10240 bytes --> <property name="maxInMemorySize" value="20480" /> <!-- 一个类似懒加载的属性.可以定义该属性.让解析文件的时候再抛异常,然后Controller中定义异常处理的方法 --> <property name="resolveLazily" value="true" /> </bean> </beans>

    3 写controller组件

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.apache.commons.io.FileUtils;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import com.kaishengit.entity.User;
    /*我们可以看出 HelloController 和一般的类并没有区别,
    它没有实现任何特殊的接口,因而是一个地道的 POJO。让这个 POJO特殊就是 Spring MVC 的注解!*/
    /*@Controller、@Service 以及 @Repository 和 @Component 注解的作用是等价的:
     * 将一个类成为 Spring 容器的 Bean。由于 Spring MVC 的 Controller 必须事先是一个 Bean,
     * 所以 @Controller 注解是不可缺少的。 */
    @Controller
    /* 类似与namespace */
    @RequestMapping("/book")
    public class HelloController {
    /* 与struts不一样的是返回值可以有也可以没有void
        struts请求方式是加@action注解,springmvc是加@RequestMapping(value="/upload",method=RequestMethod.POST)
        当只写@RequestMapping(method=RequestMethod.POST)的时候默认请求/book(也就是namespace)路径
        代表请求的路径是/book/upload,以post的方法提交
            return "hello";跟前面配置的视图解析器拼凑成一个路径:就代表前往WEB-INF/views/hello.jsp页面
            return "book/hello"跟前面配置的视图解析器拼凑成一个路径:就代表前往WEB-INF/views/book/hello.jsp页面*/
        
        
        
    
    ---------------------------------------------------    
        
        // 两个相同的请求路径/book/add 但是请求方式不一样,这个get在这里代表我要去添加页 
        @RequestMapping(value="/add",method=RequestMethod.GET)
        // 想使用的东西都可以从参数中传进来 
        public ModelAndView add(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
            // 页面传参方式1(使用的是request)    返回值是ModelAndView    
            ModelAndView mav = new ModelAndView();
            mav.addObject("name", "Rose");
            // 去哪里 
            mav.setViewName("book/add");
            // 放进session中 
            session.setAttribute("name", "sessionName");
            // 放入application中,先用session获取application
            ServletContext application = session.getServletContext();
            application.setAttribute("name", "appName");
            
            System.out.println("add");
            return mav;
        }
            
        /* 两个相同的请求路径/book/add 但是请求方式不一样,这个get在这里代表我要去添加页 
        @RequestMapping(value="/add",method=RequestMethod.GET)
        public String add(Model model) {
            //页面传参方式2(使用的是request),返回值是String
            model.addAttribute("name","jeck");
            
            return "/book/add";
        }*/
        
        
        // 接受表单的值只需要传入表单的name属性值,username要与表单中要传进来的name属性值一致 
        @RequestMapping(value="/add",method=RequestMethod.POST)
        public String save(String username) {
            System.out.println(username);
            return "redirect:/book/add";
        }
        
        // 或者当表单非常多的时候,用对象的形式
        
        
        
        
        // 两个相同的请求路径/book/add 但是请求方式不一样,这个post在这里代表我要去提交表单
        @RequestMapping(value="/add",method=RequestMethod.POST)
        /* 表单形式不用变,不用写成name="user.username"仍然用原来的name="username"
            springmvc会自动尝试能不能加入到user对象中,不能加进去的仍然是原来的方式接受比如String email
            RedirectAttributes指操作成功后给一个提示,然后刷新后提示消失*/
            
        public String save(User user,String zip,RedirectAttributes redirectAttributes) {
            System.out.println("Hello,"+user.getUsername() + " : " + user.getPassword() + " : " + zip);
            
            redirectAttributes.addFlashAttribute("message", "保存成功");
            // 表示重定向到/book/add 重定向是get请求
            return "redirect:/book/add";
        }
        
        
    
        
        
        
    --------------------------------------------------------------------    
    
        
        
        
        /* 比如ajax返回一个字符串,直接return "xxx" 
            但是返回值是String的时候,springmvc会认为返回的是路径的名字--
            所以加@ResponseBody表示这是一个相应的内容*/
        @RequestMapping("/message")
        public @ResponseBody String showMessage() {
            return "I love you";
        }
        // 如果返回的是user(实体类),会自动转换成json 需要导入jackson-all-1.8.10.jar
        @RequestMapping(value="/user",method=RequestMethod.GET,produces={"application/json;charset=UTF-8"})
        // 也可以加在方法之上 
        @ResponseBody
        public User showUser() {
            User user = new User();
            user.setUsername("张三丰");
            user.setPassword("123123");
            return user;
        }
        
        
        
    -------------------------------------------------------    
        
        
        
        
        /* url传参 */
        @RequestMapping("/show/{id1}")
        /* 传三个参数,以逗号隔开在url中就是用逗号分隔,用斜杠隔开,在url中就是用斜杠分隔
        @RequestMapping("/show/{id1},{id2},{id3}") */
        /* 加正则表达式
        @RequestMapping("/show/{id1:\d+},{id2:\d+},{id3:\d+}") */
        /* 接受url中传来的参数,但是我们不知道这个传来的参数是从url中获得的,还是从表单中获得的,
            所以加@PathVariable,代表是从url中获取 参数中的id分别对应上面传来的id,名字要一致*/
        public String show(@PathVariable int id1,@PathVariable int id2,@PathVariable int id3) {
            System.out.println("ID:" + id1);
            System.out.println("ID:" + id2);
            System.out.println("ID:" + id3);
            return "book/add";
        }
        /* 如果还想用原始的?xx=xx传参看下面,有的时候还真需要原始的?传参 */
    ----------------------------------------------------------------    
        @RequestMapping("/page")
        public String page(int p) {
            System.out.println("pageNo:" + p);
            return "book/add";
        }
            
        @RequestMapping("/page")
        /* 如果参数可有可无@RequestParam,默认是1 */
        public String page(@RequestParam(value="p",required=false,defaultValue="1")int p) {
            System.out.println("pageNo:" + p);
            return "book/add";
        }
        
    -------------------------------------------------------------    
        /* 文件上传 commons-fileupload-1.2.2.jar commons-io-2.4.jar
            需要在xxx-servlet.xml配置文件上传解析器*/
        
        
    <form action="/book/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="pic">
        <input type="text" name="username">
        <button>保存</button>
    </form>
        
        
        @RequestMapping(value="/upload",method=RequestMethod.POST)
        /* MultipartFile接受文件对象 */
        public String upload(String username,MultipartFile pic) {
            
            if(!pic.isEmpty()) {
                /*<!-- System.out.println("fileName:" + pic.getName());获取的是表单中name的属性pic -->*/
                System.out.println("fileName:" + pic.getOriginalFilename());
                System.out.println("fileSize:" + FileUtils.byteCountToDisplaySize(pic.getSize()));
                System.out.println("Content-type:" + pic.getContentType());
                System.out.println("username:" + username);
            /*     方法1: 获得输入流了,接下来你懂的 
                InputStream inputStream = pic.getInputStream();
                */
                try {
                /* 方法2: */
                    pic.transferTo(new File("C:/kaola.jpg"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
            } else {
                System.out.println("file is empty");
            }
            
            
            return "redirect:/book/add";
        }
        
        
        
        
    }

    好了,下面介绍一个spring  springMVC hibernate的 框架搭建

    --------------------------------------------------------------------
    --------------------------------------------------------------------
    --------------------------基于springMVC,hibernate,spring------------
    --------------------------------------------------------------------
    --------------------------------------------------------------------

    首先是web.xml

    <!-- web.xml-- -->
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>springmvc</display-name>
      
      <!-- 字符集过滤器 -->
      <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>
      
      <!-- OpenSessionInView -->
      <filter>
          <filter-name>openSessionInView</filter-name>
          <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>openSessionInView</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      
      
      <!-- SpringMVC中央控制器 -->
      <!--  Spring MVC 的Servlet,它将加载WEB-INF/mvc-servlet.xml 的  
        配置文件,以启动Spring MVC模块-->  
      <servlet>
          <servlet-name>mvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>mvc</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>


     <!--  Spring 容器启动监听器 -->  
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

    <!--spring服务层配置文件都放在以applicationContext开头的xml文件中,比如数据源 事务等--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext*.xml</param-value> </context-param> </web-app>

    web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在
    WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。mvc-servlet.xml
    的配置内容如下所示:
    在WEB-INF建立xxx-servlet.xml 其中xxx代表 web.xml中的<servlet-name>mvc</servlet-name>
    名字一致,所以我们在这里建立mvc-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           <!-- 有一个用途是可以返回一个对象 ,其他的暂时不知道-->
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!-- 组件扫描 扫描springmvc的controller部分 -->
    <!--对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能-->
        <context:component-scan base-package="com.kaishengit.controller"/>
        <!-- 使用上面导入的schema/mvc  启用注解-->
        <mvc:annotation-driven/>
        
        <!-- 静态资源  **该目录及其子目录-->
        <mvc:resources location="/static/" mapping="/static/**"/>
        
        
        <!-- 单纯的跳转,比如跳转到静态网页等 比如请求根的时候到index.jsp -->
        <mvc:view-controller path="/" view-name="index"/>
    
        <!-- 视图解析器 -->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
            <!-- 让它支持jstl -->
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/views/"/>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
        
        <!-- 文件上传解析器 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 解析request的编码 ,Default is ISO-8859-1 -->
            <property name="defaultEncoding" value="UTF-8" />
            <!-- 设置最大允许的大小(字节)。-1表示没有限制(默认) 1024*1024*10=10MB -->
            <property name="maxUploadSize" value="1048576000" />
            <!--被允许的最大的内存的大小,Default is 10240 bytes -->
            <property name="maxInMemorySize" value="20480" />
            <!-- 一个类似懒加载的属性.可以定义该属性.让解析文件的时候再抛异常,然后Controller中定义异常处理的方法 -->
            <property name="resolveLazily" value="true" />
        </bean>
    
    </beans>

    spring
     根目录配置applicationContext.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
    >
    
    <!-- Controller在之前的配置springmvc的时候已经扫描过了.扫描的时候记得把去除掉 -->
        <context:component-scan base-package="com.kaishengit">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
    
        <!-- 配置数据源 -->
        <context:property-placeholder location="classpath:jdbc.properties"/>
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="url" value="${jdbc.url}"/>
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="username" value="${jdbc.name}"/>
            <property name="password" value="${jdbc.password}"/>
            <property name="minIdle" value="5"/>
            <property name="maxActive" value="10"/>
            <property name="maxWait" value="5000"/>
        </bean>
    
        <!-- Hibernate SessionFactory -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="packagesToScan" value="com.kaishengit.pojo"/>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.cache.use_query_cache">true</prop>
                    <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
                </props>
            </property>
        </bean>
    
        <!-- Hibernate事务管理器 -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        
        <tx:annotation-driven transaction-manager="transactionManager"/>
        
    
    
    
    
    </beans>

    ehcache.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache>
        
        <diskStore path="java.io.tmpdir"/>
        
        <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
        />
        
        <!-- 
        <cache name="com.kaishengit.pojo.User"
            maxElementsInMemory="100"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
        />
         -->
      </ehcache>

    jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///book?useUnicode=yes&characterEncoding=UTF-8
    jdbc.name=root
    jdbc.password=root
  • 相关阅读:
    sql server中sql语句中单引号怎么转义?【转】
    如何配置Eclipse+Tomcat 开发环境【转】
    JBoss和Tomcat版本、及Servlet、JSP规范版本对应一览 【转】
    P1955 [NOI2015]程序自动分析 && 离散化学习 && lower_bound学习
    P1604 B进制星球
    [OI
    [OI
    Aiyi's Code Style for OI
    POJ1186 方程的解数
    [Daily Life]百首好歌
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4432585.html
Copyright © 2020-2023  润新知