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程序中ModelView的对象,不过它只是方便您一次返回这两个对象的holderModelView两者仍是分离的概念.

      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>

 

运行结果图:

Sprinmvc 简单测试Demo(二)

 

 

(二)关于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测试练习

Sprinmvc 简单测试Demo(二)


//现在映射前执行,首先从数据库中提取数据,然后获取用户输入的值。(个别值无需输入,ModelAttribute可以检测到没有输入的自动提取原来的值)

Sprinmvc 简单测试Demo(二)

   @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>

 

点击后成功地显示视图:

Sprinmvc 简单测试Demo(二)

 

(六)关于跳转页面(如果是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";

   }