Sprinmvc 简单测试Demo(二)
Sprinmvc 运行原理、ModelAndView测试demo、SessionAttribute测试demo、ModelAttribute测试demo、BeanNameViewResolver测试demo、springmvc关于跳转页面测试demo。
SpringMVC运行原理
1. 客户端请求提交到DispatcherServlet
2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3. DispatcherServlet将请求提交到Controller
4. Controller调用业务逻辑处理后,返回ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6. 视图负责将结果显示到客户端
(一)关于ModelAndView测试Demo
控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
代码如下:
SpringMVCTest_0623.java:
package com.atguigu.springmvc.handler;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.atguigu.springmvc.entity.User;
/**
*
* @author HH
* @date 2017-6-23
* @version jdk 1.7.0
* @function
*/
@Controller
@RequestMapping("/SpringMVCTest_0623")
public classSpringMVCTest_0623 {
public static String SUCCESS="success";
@RequestMapping("/testModelAndView")
public ModelAndViewtestModelAndView(){
System.out.println("触发testModelAndView测试");
// ModelAndView类别就如其名称所示,是代表了MVC Web程序中Model与View的对象,不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念.
ModelAndView mv=new ModelAndView("result");
//这里表示返回的是result页面。
User user=new User(); //声明对象,并赋值,通过在jsp中获取测试是否在类中
user.setEmail("[email protected]");
mv.addObject("time",new Date());
mv.addObject("user", user);
return mv;
}
}
在index.jsp中发出请求:(点击链接)
<h1>0623日练习</h1>
<a href="<%=basePath%>SpringMVCTest_0623/testModelAndView">点击触发modelandview测试练习</a>
Result.jsp页面(controller返回view,渲染)
<%@ page language="java"import="java.util.*" pageEncoding="utf-8"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTMLPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'result.jsp' starting page</title>
<meta http-equiv="pragma"content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
<meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
<meta http-equiv="description"content="This is my page">
<!--
<link rel="stylesheet"type="text/css" href="styles.css">
-->
</head>
<body>
success! <br>
email:${requestScope.user.email}
<br><br>
time:${requestScope.time}
<br><br>
</body>
</html>
运行结果图:
(二)关于SessionAttribute(登录成功,做一个session,放到一个表里面去)
//sessionattribute测试练习,在class上声明:
//@SessionAttributes(value={"user","time"}) //(1)返回对象,可以通过对象名.变量来获取。
@SessionAttributes(types={User.class,Date.class})//(2)都有值在页面上,传参为两个class的类型。详情可以查看源码
//@SessionAttributes(types={String.class,Date.class})//(3)值为空,因为不是String类型,下边声明的是对象User类型,因此返回的是空值
@RequestMapping("/SpringMVCTest_0623") //给一个映射,开发时候避免路径错乱
public classSpringMVCTest_0623 {
public static String SUCCESS="success";
@ModelAttribute("user")
//执行@RequestMapping前就已经执行了@ModelAttribute
public User getUser(@RequestParam(value="name")Stringname,
Map<String,Object> map){
User user=new User();//声明对象,并赋值,通过在jsp中获取测试是否在类中
if(null!=name){
//username不修改
user.setName("jdk");
user.setPassword("123456");
user.setAge(20);
user.setEmail("[email protected]");
System.out.println("从数据库中取出对象:"+user);
//Addressaddress =new Address();
//address.setCity("guangdong");
//address.setprocity("guangzhou");
//address.setLine("lanyuelu");
//user.setAddress(address);
map.put("user",user);
}
return user;
}
@RequestMapping("/testSessionAttribute")
public String testSessionAttribute(Map<String,Object> map){
Useruser=new User();
user.setEmail("[email protected]");
map.put("user", user);
map.put("time",new Date());
//requestScope sessionScope
return "result";
}
}
在index.jsp中:
<h1>sessionScope日练习</h1>
<a href="<%=basePath%>SpringMVCTest_0623/testSessionAttribute">点击触发modelandview测试练习</a>
跳转到result.jsp中获取代码:
email:${sessionScope.user.email}
time:${sessionScope.time}
<%@ page language="java"import="java.util.*" pageEncoding="utf-8"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'result.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<linkrel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
success! <br>
email:${requestScope.user.email}
<br><br>
time:${requestScope.time}
<br><br>
<hr>
email:${sessionScope.user.email}
<br><br>
time:${sessionScope.time}
<br><br>
<hr>
</body>
</html>
(三)ModelAttribute测试练习
//现在映射前执行,首先从数据库中提取数据,然后获取用户输入的值。(个别值无需输入,ModelAttribute可以检测到没有输入的自动提取原来的值)
@ModelAttribute("user")
//执行@RequestMapping前就已经执行了@ModelAttribute
public User getUser(@RequestParam(value="name")Stringname,
Map<String,Object> map){
User user=new User();//声明对象,并赋值,通过在jsp中获取测试是否在类中
if(null!=name){
//username不修改
user.setName("jdk");
user.setPassword("123456");
user.setAge(20);
user.setEmail("[email protected]");
System.out.println("从数据库中取出对象:"+user);
//Addressaddress =new Address();
//address.setCity("guangdong");
//address.setprocity("guangzhou");
//address.setLine("lanyuelu");
//user.setAddress(address);
map.put("user",user);
}
return user;
} @RequestMapping(value="/testModelAttribute0623",method=RequestMethod.POST)
//没有使用modelattribute的时候
publicString testModelAttribute0623(User user){
System.out.println("这是testModelAttribute0623方法");
System.out.println("user is:"+user);
return SUCCESS;
}
在index.jsp中:
<hr>
<h1>modelattributes练习测试</h1>
<form action="<%=basePath %>SpringMVCTest_0623/testModelAttribute0623"method="POST">
Username: <input type="text"name="name" ><br>
<!-- password:<input type="text"name="password" ><br>-->
email:<input type="text"name="email" ><br>
age:<input type="text"name="age" ><br>
<input type="submit" value="提交testModelAttribute0623"><br>
</form>
在success.jsp中:
<h1>0623日测试</h1>
<br><br>
user1 name:${user.name}
<br><br>
user1 password:${user.password}
<br><br>
age:${user.age}
<br><br>
email:${user.email}
<br><br>
time:${time}
(四)改进版ModelAttribute(视觉效果好,维护好,推荐):
在 controller中:
@RequestMapping(value="/testModelAttributeAfternoon",method=RequestMethod.POST)
publicStringtestModelAttributeAfternoon(@ModelAttribute("user")Useruser){
System.out.println("这是testModelAttributeAfternoon方法");
System.out.println("user is:"+user);
returnSUCCESS;
}
在jsp中:
<h1>0623日下午测试</h1>
<form action="<%=basePath %>SpringMVCTest_0623/testModelAttributeAfternoon"method="POST">
Username: <input type="text"name="name" ><br>
<!-- password:<input type="text"name="password" ><br>-->
email:<input type="text"name="email" ><br>
age:<input type="text"name="age" ><br>
<input type="submit" value="提交testModelAttribute0623"><br>
</form>
在success页面中同上。
(五)关于BeanNameViewResolver的测试Demo
首先要配置好这个解析器,在springmvc.xml中:
<!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 -->
<!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
在controller中:
@Component //(可通过制定的名字,返回视图)
//返回json的时候可以直接返回这种形式
@RequestMapping("/SuccessView")
public classSuccessView implements View{
@RequestMapping("/testBeanView")
public String testBeanView(){
System.out.println("This is testBeanView!");
return "successView";//首字母小写驼峰
// return"s";//首字母小写驼峰
// return"SuccessView";//首字母小写驼峰
}
@Override
public String getContentType(){
// TODO Auto-generated method stub
return "text/html";
}
@Override
public void render(Map<String,?> model,HttpServletRequest request,
HttpServletResponseresponse)throwsException {
// TODO Auto-generated method stub
System.out.println("this is "+SuccessView.class);
response.getWriter().write("this is SuccessView! Time is :"+newDate());
}
在index.jsp中:
<h1>2017年6月23日</h1>
This is <a href="<%=basePath %>SuccessView/testBeanView">testBeanView</a>
点击后成功地显示视图:
(六)关于跳转页面(如果是webroot下边的直接写页面名称即可,如果是在文件夹下边的,需要写明路径,如下:)
return"forward:/WEB-INF/views/success.jsp";
在controller中:
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("this is testRedirect!");
//return "forward:/redirect.jsp";
return "forward:/WEB-INF/views/success.jsp";
}
在index.jsp中通过点击链接跳转:
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("this is testRedirect!");
//return "forward:/redirect.jsp";
return "forward:/WEB-INF/views/success.jsp";
}