1.springMVC:MVC开源框架

2.springMVC开发流程:

2.1 导包:

2.2 配置前端控制器(核心) DispatcherServlet

  1. <servlet>
  2. <servlet-name>springMVC</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 声明SpringMVC配置文件位置 -->
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:spring/springMVC-servlet.xml</param-value>
  7. </init-param>
      <!-- 随项目启动 -->
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springMVC</servlet-name>
  12. <url-pattern>*.do</url-pattern>
  13. <url-pattern>/</url-pattern>
  14. </servlet-mapping>

2.3 定义后端控制器:Controller

  1. @RestController //声明此类是一个后端控制器
  2. public class TenantsAct extends BaseAct {
  3. @Resource
  4. private ITenantsService service;
  5. @Resource
  6. private TenantsActValidate validate;/**
  7. * 根据租户身份证号查询
  8. * @author Liang
  9. *
  10. * 2016年10月11日
  11. */
  12. @RequestMapping(value="/tenants/idcard", method = RequestMethod.GET)
  13. public String queryByPhone(HttpServletRequest req,HttpServletResponse res,TenantsReqParam param){
  14. ModelMapWriter writer = new ModelMapWriter();
  15. validate.queryByIdcard(param);
  16. if(param.hasErrors()){
  17. writer = ModelMapWriter.createErrWriter(param);
  18. }else{
  19. writer.put("rows", service.queryByIdcard(param.getIdcard()));
  20. }
  21. return toJson(writer);
  22. }
  23. }

2.4 定义springMVC的配置文件:

  1. 1>位置:固定 /web-inf
  2. :任意
  3. 2>名称:固定 “前端控制器名称-servlet.xml
  4. :任意
  5. *注意,如果配置文件位置和名称任意,则需要在前端控制器中声明配置文件位置:
  1. <init-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:spring/springMVC-servlet.xml</param-value>
  4. </init-param>
  1. *配置内容:
  2. <!-- 1. 扫描所有控制器中的注解 -->
  1. <context:component-scan base-package="com.lime.ibs" use-default-filters="false">
  2. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  3. <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
  4. </context:component-scan>
  1. <!--2. MVC中基于注解开发,导入注解驱动-->
  1. <mvc:annotation-driven />
  1. <!--3. 视图解析器:解析视图,具体见 2.5-->
  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <property name="prefix" value="/" />
  3. <property name="suffix" value=".jsp" />
  4. </bean>

2.5 视图解析器:视图转发

  1. <!-- 视图解析器:解析视图
  2. 控制器方法的返回值,会被视图解析器捕获。"abc"
  3. 根据捕获的内容,解析出一个视图地址:/abc.jsp
  4. 解析机制:在视图名前后拼接前缀和后缀
  5. -->
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  7. <!-- 前缀,会拼接在视图名之前 -->
  8. <property name="prefix" value="/"></property>
  9. <!-- 后缀,会拼接在视图名之后 -->
  10. <property name="suffix" value=".jsp"></property>
  11. </bean>

3 收参

3.1 零散收参

  1. //请求参数名 要和 方法参数名同名即可
  2. 1>url?id=1&name=xxx&birth=xxxx
  3. public String testMVC(String name,Integer id,Date birth){...}
  4. 2>细节:
  5. public String testMVC2(@RequestParam(required=true,defaultValue="lime") String name,
  6. @RequestParam Integer id,
  7. @RequestParam(value="b") @DateTimeFormat(pattern="yyyy-MM-dd")Date birth){...}
  8. @RequestParam(required=true,defaultValue="lime",value="abc")
  9. required=参数是否是必需传递的,如果参数上加了此注解,则required默认为true
  10. defaultValue=参数的默认值,如果参数没有收到数据,则取默认值
  11. value=定制请求参数的名称
  12. @DateTimeFormat(pattern="yyyy-MM-dd")
  13. pattern=定制日期的收参格式

3.2 实体为整体收参

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. //@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
  5. @DateTimeFormat(pattern="yyyy-MM-dd")//定制在接收请求参数时的日期格式
  6. private Date birth;
  7. get/set;
  8. }
  9. //请求参数名 要和 实体属性名同名即可
  10. url?id=61&name=c61&birth=2016/09/29
  11. public String testMVC3(User user){...}
  12. *细节,如果实体中有日期属性也可以在属性上添加@DateTimeFormat,约束日期参数格式

3.3 数组为整体收参

  1. url?hobby61=xxx&hobby61=xxx&hobby61=xxxx
  2. public String testMVC4(String[] hobby61){...}
  3. *注意如果是更复杂的数组或集合,如List<User>,则不能直接写在参数上
  4. *即public String testMVC4(List<User> users){...}是无法接收请求参数的。

3.4 集合为整体收参

  1. public class ValueObject{
  2. private List<User> users;
  3. private String[] ids;
  4. set/get;
  5. }
  6. url?users[0].id=1&users[0].name=c61&users[0].birth=2016-09-29
  7. &users[1].id=2&users[1].name=c61&users[1].birth=2016-09-29
  8. &users[2].id=3&users[2].name=c61&users[2].birth=2016-09-29
  9. public String testMVC5(ValueObject vo61){...}

3.5 收参乱码

  1. 1>get请求:在服务器的配置中添加URIEncoding="utf-8"
  2. 2>post请求:在项目中注册CharacterEncodingFilter
  1. <filter>
  2. <filter-name>characterEncodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <!-- -->
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>characterEncodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

4. 跳转

4.1 Controller –> JSP

  1. 1>转发跳转(forward)
  2. return "forward:/abc.jsp";//转发到 /abc.jsp
  3. 2>重定向跳转(redirect)
  4. return "redirect:/view/abc.jsp";//重定向到 /abc.jsp

4.2 Controller –> Controller

  1. 1>转发跳转(forward)
  2. return "forward:jump1";//转发跳转到jump1中,【jump1】相对路径,相对于当前的namespace
  3. //即,【jump1】等价于【/mvc2/jump1】
  4. return "forward:/mvc2/jump1";//转发跳转到/mvc2/jump1中,绝对路径
  5. 2>重定向跳转(redirect)
  6. return "redirect:jump2";//重定向跳转到jump1中,【jump2】相对路径,相对于当前的namespace
  7. //即,【jump2】等价于【/mvc2/jump2】
  8. return "redirect:/mvc2/jump2";//重定向跳转到/mvc2/jump2中,绝对路径
  9. *注意:跨namespace跳转时,必须使用绝对路径

4.3 跳转方式的选择

  1. *转发,重定向
  2. 1>在增删改之后,为了防止请求重复提交,重定向跳转
  3. 2>在查询之后,可以做转发跳转

5.数据传递

5.1 重定向中数据传递

  1. 1>利用session
  2. public String testData2(HttpSession session){
  3. session.setAttribute(“name”,xxx);
  4. }
  5. 页面中:${sessionScope.name}
  6. 2>如果数据时简单数据(数字,字符串)的话
  7. public String testData4(Model model,Map map,ModelMap modelM){
  8. //会将简单数据拼接在url中,成为请求参数
  9. modelM.addAttribute("name", "Oracle3");
  10. return "redirect:/data.jsp";
  11. }
  12. 页面中${param.name}

5.2 转发中数据传递

  1. 1>利用HttpServletRequest
  2. public String testData(HttpServletRequest req){
  3. req.setAttribute("name", "limeOracle");
  4. ...
  5. }
  6. 页面中${requestScope.name}
  7. 2>Model Map ModelMap 存活周期为一个请求,可以在一个请求内数据传递
  8. public String testData3(Model model,Map map,ModelMap modelM){
  9. User user=new User(...);
  10. //model.addAttribute("user",user);
  11. //model.addAttribute("name", "Oracle");
  12. //map.put("user", user);
  13. //map.put("name", "Oracle2");
  14. modelM.addAttribute("user", user);
  15. modelM.addAttribute("name", "Oracle3");
  16. ...
  17. }
  18. 页面中${requestScope.name}
  19. ${requestScope.user.id}

5.3 在JSP(View)中取值

  1. EL+JSTL
  2. ${xxxx}
  3. <c:if>
  4. <c:forEach>

6.springMVC json处理

6.1 springMVC向客户端响应一个json : @ResponseBody

6.1.1 使用方式

  1. @ResponseBody//可以加在方法上或者返回值上
  2. //方法的返回值即请求的响应内容
  3. //会将方法的返回值转换成json,并响应
  4. public User queryUser(){
  5. User user=new User(1,"lime",new Date());
  6. return user;
  7. }
  8. *注意:在springMVCjava对象序列化成json时,默认使用的是Jackson
  9. :如果就是要使用jackson做序列化,只要导入jacksonjar包即可

6.1.2 springMVC响应json细节

  1. springMVC在响应json时会设置响应头为:application/json,
  2. 响应头可以告知客户端响应数据的格式为json
  3. 所以在异步请求中,不用在定制【dataType:"json"
  4. $.ajax({
  5. url:"${pageContext.request.contextPath}/mvc5/json",
  6. type:"post",
  7. success:function(ret){//由于springMVC在响应json时会设置响应头:application/json,
  8. //则【$.ajax】会解析响应值,则ret已经是解析后的js对象
  9. alert(ret.id+" "+ret.name+" "+ret.birth);
  10. }
  11. });

6.2 springMVC接收客户端发送来的json数据:@RequestBody

  1. $.ajax({
  2. url:"${pageContext.request.contextPath}/mvc5/json2",
  3. type:"post",
  4. data:'{"id":1,"name":"limeOracle3","birth":"2016-09-29"}',
  5. contentType:"application/json",//请求数据类型为json
  6. success:function(ret){
  7. alert(ret);
  8. }
  9. });
  10. //@RequestBody:将请求体中的数据取出,解析成java对象,赋值给对应参数
  11. public String testJson(@RequestBody User user){
  12. System.out.println(user);
  13. return "ok";
  14. }
  15. *注意,@RequestBody需要jdk7,需要更换tomcatjdk

6.3 springMVC更换JSON处理方案:由jackson换成fastjson

  1. 1>导入fastjsonjar
  2. 2>配置:
  3. <mvc:annotation-driven>
  4. <mvc:message-converters>
  5. <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
  6. <property name="supportedMediaTypes">
  7. <list>
  8. <!-- 支持的格式:application/json -->
  9. <value>application/json</value>
  10. </list>
  11. </property>
  12. </bean>
  13. </mvc:message-converters>
  14. </mvc:annotation-driven>
  15. 3>如此则springMVC中使用@ResponseBody @RequestBody时,需要做的json序列化和反序列化都由fastjson完成。

7.静态资源问题

  1. <!--
  2. 静态资源:html,js,css,jpg
  3. 访问404 解决
  4. -->
  5. <mvc:default-servlet-handler/>

SpringMVC -- 梗概--壹的更多相关文章

  1. SpringMVC -- 梗概--源码--壹--springMVC json处理

    附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...

  2. SpringMVC -- 梗概--源码--壹--数据传递

    附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...

  3. SpringMVC -- 梗概--源码--壹--跳转

    1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  4. SpringMVC -- 梗概--源码--壹--收参

    附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...

  5. SpringMVC -- 梗概--贰

    1.为什么要配置: mvc:annotation-driven 1>在springMVC的处理流程中,有两个重要组件:HandlerMapping和HandlerAdapter 分别负责解析Ha ...

  6. SpringMVC -- 梗概--源码--贰--下载

    1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  7. SpringMVC -- 梗概--源码--贰--上传

    1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  8. SpringMVC -- 梗概--源码--贰--拦截器:Interceptor

    附:实体类 1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versi ...

  9. SpringMVC -- 梗概--源码--贰--异常管理

    附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...

随机推荐

  1. partition-list

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  2. video和audio

    1.video 使用: <video width="320" height="240" src="http://www.jb51.net/mov ...

  3. erlang rabbitmq-server安装

    erlang rabbitmq-server安装 yum -y install   xsltproc fop tk unixODBC unixODBC-devel make gcc gcc-c++ k ...

  4. copy file to docker from realhost

    http://blog.e3rp4y.me/blog/2014/05/23/copy-file-from-host-to-docker.html --------------------------- ...

  5. AMQP

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端 ...

  6. Leetcode: Split Array Largest Sum

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  7. ssh安装与配置

    SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. 传统的网络服务程序,如 ...

  8. paper 103:ELM算法

    ELM(Extreme Learning Machine)是一种新型神经网络算法,最早由Huang于2004年提出[Extreme learning machine: a new learning s ...

  9. MVC筛选自定义属性下拉表

    MVC筛选自定义属性下拉表 string CompanyId = ""; CompanyId = ManageProvider.Provider.Current().Company ...

  10. delphi TIdHTTP Post乱码问题

    这里主要说的是中文乱码的问题 1. 发过去的是乱码如下处理, 服务器采用的是UFT-8编码的情况下 uses  HTTPApp;      sPost := HTTPEncode(UTF8Encode ...