zoukankan      html  css  js  c++  java
  • SpringMVC_2_实操Controller

    Previous:SpringMVC_1   Next:SpringMVC_3_实操Binding

    ************************************************************

    Spring MVC起步 http://www.imooc.com/learn/47

    spring 3.0 应用springmvc 构造RESTful URL 详细讲解 (转载)http://www.cnblogs.com/zzjjian333/archive/2012/11/14/rest1.html

    (转载自:http://blog.csdn.net/yczz/article/details/5905893

    ---4-1 配置文件-------------------------------------------
    web.xml
    2.4版本以上WEBAPP才默认支持EL表达式
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


    <display-name>Spring MVC Study</display-name>
      <!-- Spring应用上下文, 理解层次化的ApplicationContext -->
      <context-param>
       <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
      </context-param>
     
      <listener>
      <listener-class>
       org.springframework.web.context.ContextLoaderListener
      </listener-class>
      </listener>
     
      <!-- DispatcherServlet, Spring MVC的核心 可以有多个DispatcherServlet,来相应不同的请求-->
      <servlet>
      <servlet-name>mvc-dispatcher</servlet-name>
      <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- DispatcherServlet对应的上下文配置, 默认为/WEB-INF/$servlet-name$-servlet.xml
       -->
      <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
            </init-param>
      <load-on-startup>1</load-on-startup>
     </servlet>
     <servlet-mapping>
      <servlet-name>mvc-dispatcher</servlet-name>
         <!-- mvc-dispatcher拦截所有的请求-->
      <url-pattern>/</url-pattern>
     </servlet-mapping>
    </web-app>

    *****************************

    mvc-dispatcher-servlet.xml:

    DispatcherServlet, Spring MVC的核心 可以有多个DispatcherServlet,来相应不同的请求

    <?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.xsd">
    
        <!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用, 提供其相关的Spring MVC配置 -->
    
        <!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required 
            @Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 -->
        <context:annotation-config />
    
        <!-- DispatcherServlet上下文, 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
        <context:component-scan base-package="com.imooc.mvcdemo">
            <context:include-filter type="annotation"
                expression="org.springframework.stereotype.Controller" />
        </context:component-scan>
    
        <!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。 DefaultAnnotationHandlerMapping 
            annotation-driven HandlerMapping -->
    
        <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
        <mvc:annotation-driven />
    
        <!-- 静态资源处理, css, js, imgs -->
        <mvc:resources mapping="/resources/**" location="/resources/" />
    
    
        <!-- 配置ViewResolver。 可以用多个ViewResolver。 使用order属性排序。 InternalResourceViewResolver放在最后。 -->
        <bean
            class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <property name="order" value="1" />
            <property name="mediaTypes">
                <map>
                    <entry key="json" value="application/json" />
                    <entry key="xml" value="application/xml" />
                    <entry key="htm" value="text/html" />
                </map>
            </property>
    
            <property name="defaultViews">
                <list>
                    <!-- JSON View -->
                    <bean
                        class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
                    </bean>
                </list>
            </property>
            <property name="ignoreAcceptHeader" value="true" />
        </bean>
    
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsps/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
    
        <!--200*1024*1024即200M resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常 -->
        <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="209715200" />
            <property name="defaultEncoding" value="UTF-8" />
            <property name="resolveLazily" value="true" />
        </bean>
    
    </beans>

    applicationContext:

    Spring应用上下文

    <?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.xsd">
    
        <context:annotation-config />
    
        <context:component-scan base-package="com.imooc.mvcdemo">
            <context:exclude-filter type="annotation"
                expression="org.springframework.stereotype.Controller" />
        </context:component-scan>
    </beans>

     ------------------------------------------------------------

    JSP:

      1. JSTL

        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>)

      2.EL表达式

        <div class="course-title">${course.title}</div>

    *JSTL和EL表达式完成了对象的输出

      3.CSS静态文件 (与配置文件中的静态资源处理相对应)

      <link rel="stylesheet"
     href="<%=request.getContextPath()%>/resources/css/main.css"
     type="text/css" />

    <%@ page language="java"
     contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>我不是真正的慕课网</title>

    <link rel="stylesheet"
     href="<%=request.getContextPath()%>/resources/css/main.css"
     type="text/css" />
    </head>
    <body>


     <div id="main">

      <div class="newcontainer" id="course_intro">
       <div class="course-title">${course.title}</div>
       <div class="course_info">
        <div class="course-embed l">
         <div id="js-course-img" class="img-wrap">
          <img width="600" height="340" alt=""
           src="<%=request.getContextPath()%>/${course.imgPath}"
           class="course_video" />
         </div>
         <div id="js-video-wrap" class="video" style="display: none">
          <div class="video_box" id="js-video"></div>
         </div>
        </div>
        <div class="course_state">
         <ul>
          <li><span>学习人数</span> <em>${course.learningNum }</em></li>
          <li class="course_hour"><span>课程时长</span> <em
           class="ft-adjust"><span>${course.duration }</span>秒</em></li>
          <li><span>课程难度</span> <em>${course.levelDesc }</em></li>
         </ul>
        </div>
    <!-- 
        <div class="course_intro">
         <div class="concerned_course add_concerned_course">
          <a href="javascript:void(0)" data-id="202"
           class="btn-add-follow js-btn-follow"> <i></i> <em
           class="concerned-icon">关注此课程</em>
          </a>
         </div>
         <div class="curse_btn">
          <a href="#">开始学习</a>
         </div>
        </div>
     -->   
       </div>
       <div class="course_list">
        <div class="outline">
         <h3 class="chapter_introduces">课程介绍</h3>
         <div class="course_shortdecription">${course.descr}</div>

         <h3 class="chapter_catalog">课程提纲</h3>
         <ul id="couList">
          <c:forEach items="${course.chapterList}" var="chapter">
           <li class="clearfix open"><a href="#">
             <div class="openicon"></div>
             <div class="outline_list l">
              <!-- <em class="outline_zt"></em> -->
              <h5 class="outline_name">${chapter.title }</h5>
              <p class="outline_descr">${chapter.descr }</p>
             </div>
           </a></li>
          </c:forEach>
         </ul>
        </div>

       </div>
      </div>

     </div>


    </body>
    </html>

    ---------------------------

    Congroller:

    *1.视图解析器的使用

      internalresourceviewresolver  http://www.mkyong.com/spring-mvc/spring-mvc-internalresourceviewresolver-example/

      SpringMVC介绍之视图解析器ViewResolver 

      mvc-dispatcher-servlet.xml视图解析器配置

    ---

    package com.imooc.mvcdemo.controller;

    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang.builder.ReflectionToStringBuilder;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    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.multipart.MultipartHttpServletRequest;

    import com.imooc.mvcdemo.model.Course;
    import com.imooc.mvcdemo.service.CourseService;


    @Controller
    @RequestMapping("/courses")
    // /courses/**
    public class CourseController {
     

    /*用来完成日志信息,在依赖管理中添加需要的API(  <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>${slf4j.version}</version>
      </dependency>)

    */
     private static Logger log = LoggerFactory.getLogger(CourseController.class);

     private CourseService courseService;

     @Autowired //使用Spring的容器管理了依赖关系
     public void setCourseService(CourseService courseService) {
      this.courseService = courseService;
     }

     
     //传统方式URL:本方法将处理 /courses/view?courseId=123 形式的URL
     @RequestMapping(value="/view", method=RequestMethod.GET)
     public String viewCourse(Integer courseId,
       Model model) {
      
      log.debug("In viewCourse, courseId = {}", courseId);
      Course course = courseService.getCoursebyId(courseId);
      model.addAttribute(course);//JSP中通过${course.title}获取

    //因为使用了SpringMVC的internalViewResolver(*1),配置了前缀后缀,只返回页面名称就可以了
      return "course_overview";
     }
     }

    ---4-3 Controller-现代方式----------------------------------------------------------------------------

     1 通过@Controller 被SPRINGDespatcherServlet进行管理

      (org.springframework.stereotype.Controller;)

    2.处理controller的根URL,类级别的requestMapping

      @RequestMapping("/courses")//

    3.方法级别的requestMapping 本方法将处理 /courses/view?courseId=123 形式的URL,通过标签@RequestParam("courseId")取得request的参数

      @RequestMapping(value="/view", method=RequestMethod.GET)

       public String viewCourse(@RequestParam("courseId")Integer courseId,    Model model) {

    4.通过日志准确观察到绑定的行为

      log.debug("In viewCourse, courseId = {}", courseId);

    package com.imooc.mvcdemo.controller;
    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Map;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang.builder.ReflectionToStringBuilder;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    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.multipart.MultipartHttpServletRequest;
    import com.imooc.mvcdemo.model.Course;
    import com.imooc.mvcdemo.service.CourseService;
    
    @Controller//
    @RequestMapping("/courses")//处理controller的根URL,类级别的requestMapping
    // /courses/**
    public class CourseController {
     
    /*用来完成日志信息,在依赖管理中添加需要的API(  <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>${slf4j.version}</version>
      </dependency>)
    */
     private static Logger log = LoggerFactory.getLogger(CourseController.class);
     private CourseService courseService;
     @Autowired //使用Spring的容器管理了依赖关系
     public void setCourseService(CourseService courseService) {
      this.courseService = courseService;
     }
     
     //方法级别的requestMapping 本方法将处理 /courses/view?courseId=123 形式的URL
     @RequestMapping(value="/view", method=RequestMethod.GET)
     public String viewCourse(@RequestParam("courseId")Integer courseId,
       Model model) {
      
      log.debug("In viewCourse, courseId = {}", courseId);//通过日志准确观察到绑定的行为
      Course course = courseService.getCoursebyId(courseId);
      model.addAttribute(course);//JSP中通过${course.title}获取
    //因为使用了SpringMVC的internalViewResolver(*1),配置了前缀后缀,只返回页面名称就可以了
      return "course_overview";
     }
    }

     ---RESTful URL  本方法将处理 /courses/view2/123 形式的URL----------------------------------------------------

    参照:spring 3.0 应用springmvc 构造RESTful URL 详细讲解  转载自http://blog.csdn.net/yczz/article/details/5905893

    Spring通过@RequestMapping("/view2/{courseId}")和@PathVariable("courseId")绑定了入参

     //RESTful URL  本方法将处理 /courses/view2/123 形式的URL
     @RequestMapping("/view2/{courseId}",method=RequestMethod.GET)
     public String viewCourse2(@PathVariable("courseId") Integer courseId,
       Map<String, Object> model) {
      
      log.debug("In viewCourse2, courseId = {}", courseId);
      Course course = courseService.getCoursebyId(courseId);
      model.put("course",course);
      return "course_overview";
     }

    ---4-4 Controller-传统方式-----------------------------------------------------------

    1.spring-mvc-study/pom.xml中引入servlet API

      <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
      </dependency>

    2.传统方法HttpServletRequest方式获取

     //方法级别的requestMapping,本方法将处理 /courses/view3?courseId=123 形式的URL
     @RequestMapping("/view3")
     public String viewCourse3(HttpServletRequest request) {
      
      Integer courseId = Integer.valueOf(request.getParameter("courseId"));  
      Course course = courseService.getCoursebyId(courseId);
      request.setAttribute("course",course);
      
      return "course_overview";
     }
     ---总结---

    1.@Controller:通过Controller annotation声明一个controller

    2.@RequestMapping (通常出现在类级别和方法级别,二者共同组合完成了对URL映射请求的拦截)通过RequestMapping annotation映射了URL和方法

    3. URL template(@RequestParam and @PathVariable):将URL路径中的参数绑定到controller method的入参

    4.HttpServletRequest and/or HttpSession:也可以获取想要的结果

  • 相关阅读:
    简单到一步安装 xgboost (Windows 64位环境)——anaconda环境
    python中的字符数字之间的转换函数
    Python之基础练习题
    SAS基础语句
    linux 查询目录大小并排序
    loadrunner get、Post 请求的一个java vuser 脚本
    mysql 解析 json格式的字段
    java 使用fast json 与 Map List互相转换
    windows 系统 端口数调整 比避免出现 time_wait连接状态过多
    java 枚举 enum使用
  • 原文地址:https://www.cnblogs.com/charles999/p/6743505.html
Copyright © 2011-2022 走看看