SSM框架(二)四种控制器请求

承接上一篇文章:SSM框架(一) 基于eclipseJee搭建SpingMVC框架
本文主讲在:controller类下的四种控制请求

一、请求接收

大致是如图流程,图中也不是很明白,详细讲述一下:
SSM框架(二)四种控制器请求

二、接收请求参数

1.字符串格式

Controller类的方法中加入形参String userName ,String userPassword
(注意jsp和controller类命名一致)

  • index.jsp主要代码:index.do

    <form action="index.do" method="post">
    	<input type="text" name="userName"/><br/>
    	<input type="text" name="userPassword"/><br/>
    	<input type="submit" value="添加"/>
    </form>
    
  • Controller.java:

    package com.cungudafa.spingmvc01.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/")
    public class UserInfoController {
    	
    		@RequestMapping(value="index")
    		public String userIndex(String userName,String userPassword){
    		System.out.println("添加操作的业务逻辑:"+userName+" "+userPassword);
    		return "success";
    	}
    }
    
  • 浏览器查看到:
    SSM框架(二)四种控制器请求
    SSM框架(二)四种控制器请求
    控制台打印:
    SSM框架(二)四种控制器请求

2.对象封装

如果请求中userName=xxx,自定义类

  • index.jsp主要代码:dologin.do

    <form action="dologin.do" method="post">
    	<input type="text" name="userName"/><br/>
    	<input type="text" name="userPassword"/><br/>
    	<input type="submit" value="添加"/>
    </form>
    
  • 创建bean目录和 UserInfo.java:
    SSM框架(二)四种控制器请求
    UserInfo.java:
    注意在jsp调用时,标签的name要与实体里的private后名称相同,同理controller调用时get方法名称方法名也要一致

    package com.cungudafa.spingmvc01.bean;
    
    public class UserInfo {
    	private Integer userId;
    	private String userName;
    	private String userPassword;
    	
    	public Integer getUserId() {
    		return userId;
    	}
    
    	public void setUserId(Integer userId) {
    		this.userId = userId;
    	}
    	
    	public String getUserName() {
    	  return userName;
    	}
    
    	public void setUserName(String userName) {
    	  this.userName = userName;
    	}
    
    	public String getUserPassword() {
    		return userPassword;
    	}
    
    	public void setUserPassword(String userPassword) {
    		this.userPassword = userPassword;
    	}
    	public UserInfo(String name, String password) {
    		super();
    		this.userName = name;
    		this.userPassword = password;
    	}
    	@Override
    	public String toString() {
    		return "User [用户=" + userName + ", 密码=" + userPassword + "]";
    	}
    }
    
    
  • 调用实体前必须更新一下配置,这里再贴一遍更新后的pom.xml、web.xml和sping-mvc.xml
    pom.xml 增加了文件上传部分:

    	<!-- 文件上传 -->
    	<dependency>
    	    <groupId>commons-fileupload</groupId>
    	    <artifactId>commons-fileupload</artifactId>
    	    <version>1.3.3</version>
    	</dependency>
    

    web.xml 增加了浏览器url解析
    SSM框架(二)四种控制器请求
    web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1" metadata-complete="true">
    
    	<!-- 声明Spring的主配置文件 -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:config/*.xml</param-value>
    	</context-param>
    	<!-- 配置Spring的监听器 -->
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    	
    	<!-- 解析乱码 -->
    	<filter>
    		<filter-name>characterEncodingFilter</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>
    		<init-param>
    			<param-name>forceEncoding</param-name>
    			<param-value>true</param-value>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>characterEncodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	
    	<!-- 配置SpringMVC后台 .do -->
    	<servlet>
    		<servlet-name>back</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:config/spring-mvc.xml</param-value>
    		</init-param>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>back</servlet-name>
    		<url-pattern>*.do</url-pattern>
    	</servlet-mapping>
    
    </web-app>
    
    

    sping-mvc.xml: 相对之前增加了上传文件部分,解析包改为到最大目录com.cungudafa.spingmvc01
    SSM框架(二)四种控制器请求
    SSM框架(二)四种控制器请求
    sping-mvc.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    	
    	<!-- 启用注解 -->
    	<mvc:annotation-driven></mvc:annotation-driven>
    	
        <!-- 配置SpringMVC -->
        <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->  
    	<context:component-scan base-package="com.cungudafa.spingmvc01" use-default-filters="false">
    		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    	</context:component-scan>
    	<!-- 上传文件的处理器 -->
    	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
    	
    	<!-- JSP视图 -->
    	<!-- 定义跳转的文件的前后缀 ,视图模式配置--> 
    	<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<!-- controller中return时会自动加上前缀和后缀,变成一个完整的url -->
    		<property name="prefix" value="/WEB-INF/"></property>
    		<property name="suffix" value=".jsp"></property>
    	</bean>
    </beans>
    
  • Controller.java:

    package com.cungudafa.spingmvc01.controller;
    
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.cungudafa.spingmvc01.bean.UserInfo;
    
    @Controller
    @RequestMapping("/")
    public class UserInfoController {
    	
    	@RequestMapping(value="index")
    	public String userIndex(String userName,String userPassword){//直接同命名
    	System.out.println("添加操作的业务逻辑:"+userName+" "+userPassword);
    	return "success";
    	}
    
    	@RequestMapping("login")
    	public String login(){
    		return "login";
    	}
    	@RequestMapping(value="dologin")
    	public String login(UserInfo a,HttpSession session){//UserInfo a 封装对象,实例化;HttpSession session传值
    		System.out.println("用户:"+a.getUserName()+"\t密码:"+a.getUserPassword());
    		session.setAttribute("user", a);//从后台controller再传回前端页面,可调用user打印出来
    		return "success";
    	}
    }
    
    
  • 封装对象结果–浏览器查看到:
    SSM框架(二)四种控制器请求
    SSM框架(二)四种控制器请求
    控制台打印出:
    SSM框架(二)四种控制器请求

三、将某些值/某些对象放在session中

具体代码参考第二部分

四、跳转到目标视图/下一个Servlet

  • 在controller中加入关键代码:
    package com.cungudafa.spingmvc01.controller;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.cungudafa.spingmvc01.bean.UserInfo;
    
    /*
     * 一个控制器
     * @author Administrator 
     * 
     */
    @Controller
    @RequestMapping("/")
    public class UserInfoController {
    	
    	@RequestMapping(value="index")
    	public String userIndex(String userName,String userPassword){
    	System.out.println("添加操作的业务逻辑:"+userName+" "+userPassword);
    	return "success";
    	}
    
    	@RequestMapping("login")
    	public String login(){
    		return "login";
    	}
    	@RequestMapping(value="dologin")
    	public String login(UserInfo a,HttpSession session){
    		System.out.println("用户:"+a.getUserName()+"\t密码:"+a.getUserPassword());
    		session.setAttribute("user", a);
    		return "success";
    	}
    	@RequestMapping("index1")
    	public void index1(HttpServletResponse response){
    		try {
    			response.sendRedirect("/SpingMVC01/index.jsp");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	@RequestMapping("index2")
    	public void index2(HttpServletResponse response){
    		try {
    			PrintWriter out = response.getWriter();
    			out.println("hello");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	@RequestMapping("index301")
    	public String index301(){
    		return "login";
    	}
    	@RequestMapping("index302")
    	public @ResponseBody String index302(){
    		return "login";
    	}
    	
    	@RequestMapping("student/{id}")
    	public String find(@PathVariable("id") Integer id,HttpSession session){
    		System.out.println("id = " + id);
    		session.setAttribute("id", id);
    		return "index";
    	}
    	
    }
    
    

情景1:response直接访问

SSM框架(二)四种控制器请求

  • 浏览器输入:http://localhost:8080/SpingMVC01/index2.do查看:
    SSM框架(二)四种控制器请求

情景2:控制跳转

SSM框架(二)四种控制器请求

  • 浏览器分别输入:http://localhost:8080/SpingMVC01/index301.dohttp://localhost:8080/SpingMVC01/index302.do查看:
    SSM框架(二)四种控制器请求
    SSM框架(二)四种控制器请求

情景3:{id}记录

SSM框架(二)四种控制器请求

  • 浏览器输入:http://localhost:8080/SpingMVC01/student/1.do查看:
    SSM框架(二)四种控制器请求
    控制台打印出:
    SSM框架(二)四种控制器请求

  • -> 在这里我们在success.jsp设置一个打印符:
    success.jsp关键代码:

      <body>
      	<h1>success</h1>
          ${id}
     </body>
    
  • -> 将return的index页面换为success页面:
    controller关键代码:

    	@RequestMapping("student/{id}")
    	public String find(@PathVariable("id") Integer id,HttpSession session){
    		System.out.println("id = " + id);
    		session.setAttribute("id", id);
    		return "success";
    	}
    
  • 运行结果:
    浏览器输入:http://localhost:8080/SpingMVC01/student/1.do查看:
    SSM框架(二)四种控制器请求
    控制台打印出:
    SSM框架(二)四种控制器请求