springmvc01

1.安装SpringMVC插件
  包名称:springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite.zip(和springmvc版本必须一致)
  作用:快速在web.xml中配置springmvc,alt+/ 选择dispatcherservlet
  注意:配置完成后,修改 init-param和mapping

2.创建SpringMVC过程
 I.创建Web工程
  a. 增加Spring Jar包
  b. Web.xml配置Spring支持

  <?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_3_0.xsd" 
    id="WebApp_ID" version="3.0">
    <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>/</url-pattern>
    </servlet-mapping>
  </web-app>

 II.增加Spring配置
  a.增加自动扫描的包
  b.配置一个bean:视图解析器,逻辑视图转换为物理视图

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <!-- 自动扫描的包名 -->
    <context:component-scan base-package="com.test.controller" />

    <!-- 默认的注解映射的支持 -->
    <mvc:annotation-driven>
      <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
      </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 视图解释类,定义跳转的文件的前后缀 -->
    <!--
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
      <property name="prefix" value="/views/" /> <property name="suffix" value=".jsp"/>
      <property name="requestContextAttribute" value="rc" />
    </bean>
    -->

    <!-- 拦截器 -->
    <!--
    <mvc:interceptors>
      <bean class="com.fpx.ce.foundation.preference.PreferenceChangeInterceptor" />
      <mvc:interceptor> 
        <mvc:mapping path="/page/home"/>
        <bean class="com.fpx.ce.foundation.user.UserInterceptor" />
      </mvc:interceptor>
      <mvc:interceptor>
        <mvc:mapping path="/service/**" /> 
        <bean class="com.fpx.ce.foundation.log.LogHandlerInterceptor" />
      </mvc:interceptor> 
      <mvc:interceptor> <mvc:mapping path="/test/**" /> 
        <mvc:mapping path="/service/**"/> 
        <bean class="com.lemon.finder.web.SharedRenderVariableInterceptor" /> 
      </mvc:interceptor>
    </mvc:interceptors>
    -->

    <!-- 对静态资源文件的访问 方案一 (二选一) -->

    <mvc:default-servlet-handler />

    <mvc:annotation-driven/>

    <!-- 对静态资源文件的访问 方案二 (二选一) -->

    <!-- <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/> 
    <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/> 
    <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/> -->
  </beans>

 III.配置控制器
  任何的javabean都可以作为控制器,@Controller
  方法可以接受请求并且做出相应的响应。

  @Controller
  public class 类 {
    @RequestMapping(value="/hello")
    public String 方法(){
      return "success";
    }
  }

  方法的返回值:当前业务方法处理完毕之后,跳转的Web资源。

3.@RequestMapping注解
 如果一个注解只有一个value属性,可以这样写RequestMapping("/hello")

 I.修饰类

  @RequestMapping(value="/springmvc")
  @Controller
  public class 类 {
    @RequestMapping(value="/hello")
    public String 方法(){
      return "success";
    }
  }

 II.指定请求方法
  @Request(value="/hello", method=RequestMethod.POST) //必须POST请求/hello

 III.指定params和headers
  param1 请求参数必须包含名为param1的请求参数
  !param1 请求参数不能包含名为param1的请求参数
  param1!=value1 可以包含param1的请求参数,但其值不能为value1
  {"param1=value1","param2"} 多个请求参数指定

  @Request(value="/hello", method=RequestMethod.POST,
  params={"name=tom", "age!=12"},
  headers={"accept=text/html"})


4.Ant风格的请求映射
  ?: 匹配文件名中的一个字符
  * : 匹配文件命中的任意字符,指一层路径
  **: **匹配多层路径

5.@PathVariable映射URL绑定的占位符

  @RequestMapping(value="/hello/{id}")
  public String helloword(@PathVariable(value="id") int id) {
    System.out.println(id);
    return "success";
  }

6.REST风格
  资源:网络上的实体
  表现层:把资源具体呈现在客户端的方式
  状态转换:Http是无状态请求,请求方式保存在服务端,是建立在表现层上

  GET/POST/PUT/DELETE

  //GET
  @RequestMapping(value="/testGet/{id}", method=RequestMethod.GET)
    public String testGet(@PathVariable(value="id") int id) {
    System.out.println("请求ID为:"+id+"数据");
    return "success";
  }

  //POST
  @RequestMapping(value="/testPost", method=RequestMethod.POST)
  public String testPost() {
    System.out.println("添加数据");
    return "success";
  }

  //HiddentHttpMethodFilter:过虑器,可以过虑我们所有的请求,并且可以划分为四种。
  //POST--> 寻找请求参数,是否有一个名字method这样的一个请求方式,值为DELETE、PUT请求来区分,如果没有则为POST  
  //支持PUT、DELETE请求必须在Web.xml增加过滤器

  <filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddentHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-pattern>/*</filter-pattern>
  </filter-mapping>

  //DELETE

  @RequestMapping(value="/testDelete/{id}", method=RequestMethod.DELETE)
  public String testDelete(@PathVariable(value="id") int id) {
    System.out.println("删除数据");
    return "success";
  }

  //DELETE对应表单格式

  <form action="springmvc/testDelete/12" method="POST">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" value="DELETE"/>
  </form>

  //PUT

  @RequestMapping(value="/testPut/{id}", method=RequestMethod.PUT)
  public String testPost(@PathVariable(value="id") int id) {
    System.out.println("修改数据");
    return "success";
  }

  //PUT对应表单格式

  <form action="springmvc/testPut/12" method="POST">
    <input type="hidden" name="_method" value="PUT"/>
    <input type="submit" value="PUT"/>
  </form>


7.获取请求值@RequestParam注解

  @RequestMapping(value="/testRequestParam")
  public String testRequestParam(@RequestParam(value="id", required=true) int id, @RequestParam(value="name") String name) {
    return "success";
  }

  a.如果形参和请求参数的名称一致时,可以省略RequestParam
  b.如果不一致,则必须通过RequestParam的参数指定绑定的请求参数名称
  c.required 如果请求参数不存在,则报出一个required的错误

8.POJO属性进行自动匹配,自动为该对象填充值,支持值联属性

  public class Address{
    private String city;
    private String country;
    //get/set构造方法
  }

  public class User{
    private Address address;
    private int id;
    private String name;
    //get/set/构造方法

    @Override
    public String toString(){
      return "User [id="+id+",name="+name+"]";
    }

    @RequestMapping(value="/testRequestParam")
    public String testRequestParam(User user) String name) {
      user.toString();
      return "success";
    }
  }

  User中的名称和jsp名称一致时,获取页面request请求值

  <form action="/testRequestParam">
    <input type="text" name="id" />
    <input type="text" name="name" />
    <input type="text" name="address.city" />
    <input type="text" name="address.country" />
    <input type="submit" value="submit"/>
  </form>

 

9.请求报文头 @RequestHeader注解

  @RequestMapping(value="/testRequestHeader")
  public String testRequestHeader(@RequestHeader("Aceept") String a) {
    System.out.println(a);
    return "success";
  }

 

10.请求Cookie,@CookieValue注解

  @RequestMapping(value="/testRequestCookie")
  public String testCookie(@CookieValue("JSESSIONNID") String a) {
    System.out.println(a);
  return "success";
  }


11.Servlet API作为参数
  HttpServletRequest
  HttpServletResponse
  HttpSession
  Java.security.Principal 授权
  Locale 本地信息
  InputStream
  OutputStream
  Reader
  Writer 相应输出流对象

  可以把这九种类型作为请求形参

  @RequestMapping(value="/testServletAPI")
    public String testServletAPI(HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request);
    System.out.println(response);
    return "success";
  }

12. 处理模型数据
  ModelAndView: 处理方法返回值类型为ModelAndView时,方法体既可以通过该对象添加模型数据
  Map、Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或者java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
  @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便更多请求之间可以共享属性
  @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中

 I.ModelAndView
  a)核心业务返回值为ModelAndView;模型数据,视图
  b)方法的内部,创建ModelAndView对象
     设置视图:
     setView(View view);
     setViewName(String);
     添加数据:
     addObject(String, Object);
     addObjects(Map map);

  c)ModelAndView当中的数据是放在请求范围中的

    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView() {
    ModelAndView mv = new ModelAndView();
    //设置跳转的视图setView/setViewName
    mv.setViewName("success");
    //增加值,这些值是放在Request域中的
    mv.addObject("name", "ival");
      return mv;
    }


 II. Map/Model以及ModelMap
  当中的数据是放在请求范围中的

  @RequestMapping("/testMap")
  public String testMap(Map<String, Object> map) {
    map.put("age", 12);
    return "success";
  }

  @RequestMapping("/testModel")
  public String testModel(Model model) {
    model.addAtrribute("mail", "ival@qq.com");
    return "success";
  }

  @RequestMapping("/testModelMap")
  public String testModelMap(ModelMap modelmap) {
    modelmap.addAtrribute("mail", "ival@qq.com");
    return "success";
  }


13.@SessionAttribute多个请求之间共享数据

  @Controller
  @RequestMapping("/SpringMVC")
  @SessionAtributes(value={"city"}) //提升city的域到Session域
  public class HelloWorld {
  @RequestMapping(/testReqult)
    public String testResult() {
    return "result";
    }
  }

 @SessionAttribute 注意事项
  1.要求放置的值,必须放在Model数据里(request范围中有限)
  2.标注属性:
   a) value:String[]
     value={"a","b"}
   b) types:Class[]
     types={String.class}
14.@ModelAttribute 在数据之前对模型数据进行的处理
 I.方法:在当前控制中所有的业务方法调用之前执行的方法
  1)修改没有返回值的方法

  @ModelAttribute
    public void start(Map<String, Object> map) {
    Account account = new Account(1,"TOM", "2016-1-1");
    map.put("account", account)
  }
  @RequestMapping("/testModelAttribute")
    public String update(Account account){
    System.out.println(account);
    return "success";
  }

  a.执行ModelAttribute修改方法
  b.获取的原始数据放置到请求范围中指定的key,对应的value
  c.pojo入参从请求范围当中查找指定key对应的value对象,找到的话,对象的
  d.前端用户数据的值与业务方法的入参进行绑定。

  2)修改有返回值的方法

  @ModelAttribute
    public Account start(value="abc") {
    Account account = new Account(1,"TOM", "2016-1-1");
    retrun account;
  }
  @RequestMapping("/testModelAttribute")
    public String update(@ModelAttribute("abc")Account account){
    System.out.println(account);
  return "success";
  }

 

 II. 业务方法的入参
  方法的入参,告知方法入参进行前段绑定之前,首先请求范围当中查找指定的key(POJO类的首字母小写对应的单词)对应的value值对象。

  @ModelAttribute
  public void start(Map<String, Object> map) {
    Account account = new Account(1,"TOM", "2016-1-1");
    map.put("abc", account)
  }


  @RequestMapping("/testModelAttribute")
  public String update(@ModelAttribute("abc") Account account){
    System.out.println(account);
  return "success";

  }

15. 视图解析流程
 I.视图最终的页面选软,View视图来做,render。
 II.跳转到目标视图。

16.国际化
  写对应的资源文件.properties
  资源文件的名称_语言编码_国家编码.properties
  abc_zh_CH.properties
  abc_en.US.properties
  内容:key=value

 I.国际化的资源
 II.告知springMVC所使用的资源文件

  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="abc"></property>
  </bean>

  注意:id必须为messageSource

 III.JSTL页面使用标签使用国际化
  Core: <fmt:message key="id"><fmt:message>

16.页面给视图定义一个映射mvc:view-controller
  <mvc:view-controller path="/abcdef" view-name="a">    //a逻辑视图对应原来的a.jsp
  如果给某一个视图设置映射信息,其他控制方法映射全部无效,必须加上下面的配置
  <mvc:annotatime-driven></mvc:annotatime-driven>

17.自定义视图
 I.视图类型:实现一个接口view

  @Component //注解生成bean对应的id为类的首字母写的名称即myView
  public class MyView implements View {
    public String getContextType(){
      return "text/html";
    }
    @Override
    public void render(Map<String, ?>model, HttpServletRequest request, HttpServletResponse response)throws Exception{
    }
  }

 II.视图加载Spring容器中
 III.对应视图解析器:BeanNameResolver
  //自定义视图的解析器,优先级(内部资源解析器优先级最高)

  <bean class="org.springframework.web.servlet.view.BeanNameResolver" >
    <property name="basename" value="100"></property>
  </bean>

18.spring的form表单
 I.传统JSP完成从服务端获取的数据,显示的时候,非常复杂。
 II.form表单标签库,来代替所有的表单标签。
  1.可以完成回显
  2.可以代替JSP当中一些复杂操作
 III.使用流程
  1.引入form表单
  2.常用标签
    1)<form:form>:可以完成回显的操作,modelAttribute:完成回显。key,自动的到请求范围中,寻找指定key对应的value值,如果没有指定
     modelAttribute属性,springmvc自动的请求范围当中去寻找一个叫做commmad这样key对应的对象,如果也没有command。出错。
    2)<form:input path="">:文本框,path的name属性值
    3)

     <%@ taglib="" prefix="form" %>
     <form:form action="" method="" modelAttribute="abc">
     <table>
      <tr><td>name</td><td><form:input path="name"/></td></tr>
      <tr><td>emill</td><td><from:input path="mail"/></td></tr>
      <tr><td>gender</td>td><form:radiobuttons path="gender" items="${requestScop.genders}"></td></tr>
      <tr><td>department</td><td>form:select path="depts.deptName" items="${requestScope.depts}" itemLabel="deptName" itemvlue="deptid"<td></tr>

      <tr><input type="submit" vaue="add"/></tr>

     <tbale>

     </form:form>

     map.put("abc", empl);

19.Springmvc如何处理静态资源
 I.springmvc的配置文件
  <mvc:default-servlet-handler/> //让DisppatcherServlet核心控制器,其他的映射全部失效
 II. <mvc:annotation-driven/> 

 

posted @ 2018-05-05 14:59  IVAm  阅读(84)  评论(0)    收藏  举报