结果跳转方式

通过SpringMVC来实现转发和重定向 - 无需视图解析器;==

@Controller
public class ResultSpringMVC {@RequestMapping("/rsm/t1")public String test1(){//转发return "/index.jsp";}@RequestMapping("/rsm/t2")public String test2(){//转发二return "forward:/index.jsp";}@RequestMapping("/rsm/t3")public String test3(){//重定向return "redirect:/index.jsp";}
}

通过SpringMVC来实现转发和重定向 - 有视图解析器;重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛(不受视图解析器的影响) , 所以注意路径问题.可以重定向到另外一个请求实现 .

数据处理

处理提交数据

1、提交的域名称和处理方法的参数名一致
提交数据 : http://localhost:8080/hello?name=kuangshen
处理方法 :

@RequestMapping("/hello")
public String hello(String name){System.out.println(name);return "hello";
}

后台输出 : kuangshen
2、提交的域名称和处理方法的参数名不一致
提交数据 : http://localhost:8080/hello?username=kuangshen
处理方法 :

//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){System.out.println(name);return "hello";
}

后台输出 : kuangshen
@RequestParam可以理解为起一个别名
3、提交的是一个对象
要求提交的表单域和对象的属性名一致 , 参数使用对象即可
1.实体类

public class User {private int id;private String name;private int age;//构造//get/set//tostring()
}

2.提交数据 : http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15
3.处理方法 :

@RequestMapping("/user")
public String user(User user){System.out.println(user);return "hello";
}

后台输出 : User { id=1, name=‘kuangshen’, age=15 }
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

处理提交数据

数据显示到前端

第一种 : 通过ModelAndView(实现Controller )
我们前面一直都是如此 . 就不过多解释

public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {//返回一个模型视图对象ModelAndView mv = new ModelAndView();mv.addObject("msg","ControllerTest1");//可以进行设置返回的逻辑视图,进行控制展示层的跳转mv.setViewName("test");return mv;}
}

第二种 : 通过ModelMap
ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){//封装要显示到视图中的数据//相当于req.setAttribute("name",name);model.addAttribute("name",name);System.out.println(name);return "hello";
}

第三种 : 通过Model
Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){//封装要显示到视图中的数据//相当于req.setAttribute("name",name);model.addAttribute("msg",name);System.out.println(name);return "test";
}

就对于新手而言简单来说使用区别就是:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

乱码问题

1.我们可以在首页编写一个提交的表单

<form action="/e/t" method="post"><input type="text" name="name"><input type="submit">
</form>

2.后台编写对应的处理类

@Controller
public class Encoding {@RequestMapping("/e/t")public String test(Model model,String name){model.addAttribute("msg",name); //获取表单提交的值System.out.println(name);return "test"; //跳转到test页面显示输入的值}
}

3.输入中文测试,发现乱码


但实际乱码很大程度是后端问题

不得不说,乱码问题是在我们开发中十分常见的问题,也是让我们程序猿比较头大的问题!以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置 .
修改了xml文件需要重启服务器!

//SpringMVC的乱码过滤器
<filter><filter-name>encoding</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>encoding</filter-name><url-pattern>/</url-pattern>
</filter-mapping>

有些极端情况下.这个过滤器对get的支持不好 .
处理方法 :
1.修改tomcat配置文件 : 设置编码!

<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

2.自定义过滤器

package com.kuang.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;/*** 解决get和post请求 全部乱码的过滤器*/
public class GenericEncodingFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//处理response的字符编码HttpServletResponse myResponse=(HttpServletResponse) response;myResponse.setContentType("text/html;charset=UTF-8");// 转型为与协议相关对象HttpServletRequest httpServletRequest = (HttpServletRequest) request;// 对request包装增强HttpServletRequest myrequest = new MyRequest(httpServletRequest);chain.doFilter(myrequest, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {private HttpServletRequest request;//是否编码的标记private boolean hasEncode;//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰public MyRequest(HttpServletRequest request) {super(request);// super必须写this.request = request;}// 对需要增强方法 进行覆盖@Overridepublic Map getParameterMap() {// 先获得请求方式String method = request.getMethod();if (method.equalsIgnoreCase("post")) {// post请求try {// 处理post乱码request.setCharacterEncoding("utf-8");return request.getParameterMap();} catch (UnsupportedEncodingException e) {e.printStackTrace();}} else if (method.equalsIgnoreCase("get")) {// get请求Map<String, String[]> parameterMap = request.getParameterMap();if (!hasEncode) { // 确保get手动编码逻辑只运行一次for (String parameterName : parameterMap.keySet()) {String[] values = parameterMap.get(parameterName);if (values != null) {for (int i = 0; i < values.length; i++) {try {// 处理get乱码values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}}hasEncode = true;}return parameterMap;}return super.getParameterMap();}//取一个值@Overridepublic String getParameter(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);if (values == null) {return null;}return values[0]; // 取回参数的第一个值}//取所有值@Overridepublic String[] getParameterValues(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);return values;}
}

这个也是我在网上找的一些大神写的,一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了!
然后在web.xml中配置这个过滤器即可!
乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8!

SpringMVC自学日志05(结果跳转方式,数据处理 ,乱码问题)相关推荐

  1. SpringMVC自学日志06(JSON)

    什么是JSON? JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编程语言的文本格式来存储和表示数据. ...

  2. SpringMVC自学日志04(Controller 及 RestFul风格 )

    控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个 ...

  3. SpringMVC自学日志02(初识SpringMVC)

    什么是SpringMVC? Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web(其中servlet是最主要的)框架. 官方文档地址:https:// ...

  4. SpringMVC自学日志07(整合Mybatic)

    整合步骤 导入相关jar包 <!--junit--> <dependency><groupId>junit</groupId><artifactI ...

  5. SpringMVC自学日志03(SpringMVC注解)

    第一步:新建一个Moudle , 添加web支持!建立包结构 com.kuang.controller 第二步:由于Maven可能存在资源过滤的问题,我们将配置完善 <build>< ...

  6. SpringMVC自学日志01(回顾servlet)

    MVC:模型(dao,service) 视图(jsp) 控制器(servlet) dao service servlet:转发,重定向. 导入总环境pom.xml依赖 <dependencies ...

  7. Spring自学日志04(java的方式配置Spring)

    使用java的方式配置Spring 稳现在完全不使用xml配置,java来做 javaConflg是spring的一个子项目,在Spring4后,它成为了一个核心功能. import com.java ...

  8. Mybatis自学日志05(复杂环境的搭建)

    建表 create table student( id int(10) primary key, name varchar(20) default null, tid int(10) default ...

  9. Spring自学日志05(代理模式)

    为什么要学习代理模式?因为这就是SpringAOP的底层! 抽象角色:一般是接口或抽象类 真实角色:被代理的角色 代理角色:代理真实角色,代理后还会做一些附属操作 客户:访问代理角色的人 静态代理模式 ...

最新文章

  1. 线段树 + 树形换根 + dfs序 ---- 离线启发式求解 (有点像树上启发式合并答案) F. Nearest Leaf
  2. 升级python2.6.6到python2.7导致pip命令不可用
  3. flex布局的相关注意事项
  4. vue设置全局变量和修改
  5. 【职场】税前110万
  6. linux有没有递归函数,递归函数
  7. 大数据之-Hadoop3.x_MapReduce_切片源码总结---大数据之hadoop3.x工作笔记0105
  8. 用一道面试题考察对闭包的理解
  9. Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1696 1024)
  10. Spring源码之getBean(获取 bean)方法(一)解读
  11. CMU 15-213 Introduction to Computer Systems学习笔记(3) Floating Point
  12. URLDecoder.decode 过时
  13. 摄影曝光口诀_摄影中的“向右曝光”是什么以及为什么要这么做
  14. 正则 显示0-100的数字(可以是小数也可以是整数,不能是01,02可以是0.1)
  15. 微信小程序——获取用户个人信息
  16. 中央银行调节货币供应量的三个手段
  17. angular自带的jquery lite用法实例,不用引入jq照样回到老夫就用jq的感觉~
  18. 2018年吉林大学软件学院软件工程学硕复试笔试题回忆
  19. c++处理excel
  20. 计算机机房方面的职业资格证,【国家标准】国家职业技能标准 (2019年版) 水文勘测工(33页)-原创力文档...

热门文章

  1. Docker+Teamcity+Maven+SVN搭建持续集成环境
  2. Python学习日记(3)Python内建函数map()、filter()和匿名函数表达式
  3. 数据的标准化【转载】
  4. 利用virt-manager,xmanager, xshell启动界面来管理虚拟机
  5. Linux的概念与体系 6. Linux文本流(转载)
  6. PHP 查找链表倒数第i个节点
  7. [转]Java书籍Top 10
  8. 三种方法实现弹出框边框半透明和圆角的效果
  9. 线性表中顺序表基本运算的实现---数据结构(C)
  10. STM32CubeMX的安装