• spring 16-Spring框架Spring MVC方法参数深入


    使用int类型进行接收

    • 在Spring MVC里面对于参数的接收也都是按照字符串接收
    • 而后在帮助用户自动进行转型控制

    测试方法:

    public class EmpAction extends AbstractAction{
    	private Logger log = Logger.getLogger(EmpAction.class) ;
        @RequestMapping("remove")
        public ModelAndView remove(int eid){
        	System.out.println("输出的eid结果:"+ eid * 2);
        	return null;
        }
    }
    

    测试url-1:

    http://localhost:8080/springdemo/pages/emp/remove.action?eid=123
    
    输出结果:
    输出的eid结果:246
    

    测试url-2:

    http://localhost:8080/springdemo/pages/emp/remove.action?eid=liang
    
    如果输入的类型不同,则出现报错,输出结果:
    2018-12-07 14:14:36,648 WARN [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] - Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "liang"]
    

    设置参数名称

    @RequestParam的作用:

    • 可以指定参数名称
    • 如果没有设置参数内容,可自动使用一个默认值来替换

    测试方法:

    import org.springframework.web.bind.annotation.RequestParam;
    public class EmpAction extends AbstractAction{
    	private Logger log = Logger.getLogger(EmpAction.class) ;
        @RequestMapping("remove")
        public ModelAndView remove(@RequestParam(value="empno",defaultValue="10") int eid){
        	System.out.println("输出的eid结果:"+ eid * 2);
        	return null;
        }
    }
    

    测试url-1:

    http://localhost:8080/springdemo/pages/emp/remove.action?empno=1121
    
    输出结果:
    输出的eid结果:2242
    

    测试url-2:

    http://localhost:8080/springdemo/pages/emp/remove.action
    
    输出结果:
    输出的eid结果:20
    

    分页处理

    测试方法:

    public class EmpAction extends AbstractAction{
    	private Logger log = Logger.getLogger(EmpAction.class) ;
        @RequestMapping("list") 
        public ModelAndView list(
        		@RequestParam(value = "cp", defaultValue = "1") int currentPage,
        		@RequestParam(value = "ls", defaultValue = "5") int lineSize , 
        		@RequestParam(value = "col", defaultValue = "ename") String column, 
        		@RequestParam(value = "kw", defaultValue = "")  String keyWord) {
        	log.info("*** currentPage = " + currentPage);
        	log.info("*** lineSize = " + lineSize);
        	log.info("*** column = " + column);
        	log.info("*** keyWord = " + keyWord);
        	return null ;
        }
    }
    

    测试url-1:

    http://localhost:8080/springdemo/pages/emp/list.action
    
    输出结果:
    2018-12-07 14:30:02,393 INFO [cn.liang.action.EmpAction] - *** currentPage = 1
    2018-12-07 14:30:02,393 INFO [cn.liang.action.EmpAction] - *** lineSize = 5
    2018-12-07 14:30:02,393 INFO [cn.liang.action.EmpAction] - *** column = ename
    2018-12-07 14:30:02,393 INFO [cn.liang.action.EmpAction] - *** keyWord =
    

    测试url-2:

    http://localhost:8080/springdemo/pages/emp/list.action?cp=3&ls=10&col=ename&kw=liang
    
    输出结果:
    2018-12-07 14:31:09,188 INFO [cn.liang.action.EmpAction] - *** currentPage = 3
    2018-12-07 14:31:09,193 INFO [cn.liang.action.EmpAction] - *** lineSize = 10
    2018-12-07 14:31:09,193 INFO [cn.liang.action.EmpAction] - *** column = ename
    2018-12-07 14:31:09,193 INFO [cn.liang.action.EmpAction] - *** keyWord = liang
    

    内置对象配置

    测试方法:

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    public class EmpAction extends AbstractAction{
    	private Logger log = Logger.getLogger(EmpAction.class) ;
        @RequestMapping("get")
        public ModelAndView get(HttpServletRequest request,int eid,HttpServletResponse response) {
        	HttpSession session = request.getSession();	// 取得Session对象
        	ServletContext application = request.getServletContext() ;
        	log.info("*** contextPath = " + request.getContextPath());
        	log.info("*** sessionId = " + session.getId());
        	log.info("*** realPath = " + application.getRealPath("/")); 
        	try {
        		response.getWriter().println("Hello World !") ;
        	} catch (IOException e) {
        		e.printStackTrace();
        	}
        	return null ; 
        }
    }
    

    测试url:

    http://localhost:8080/springdemo/pages/emp/get.action?eid=123
    
    输出结果:
    2018-12-07 14:34:41,106 INFO [cn.liang.action.EmpAction] - *** contextPath = /springdemo
    2018-12-07 14:34:41,106 INFO [cn.liang.action.EmpAction] - *** sessionId = D94C3830438FE3F8D28DD4B28FB0276B
    2018-12-07 14:34:41,106 INFO [cn.liang.action.EmpAction] - *** realPath = /Users/liang/Workspaces/MyEclipse 2017 CI/.metadata/.me_tcat85/webapps/springdemo/
    

    参数与VO转换

    编写Emp的VO类:

    package cn.liang.vo;
    import java.io.Serializable;
    import java.util.Date;
    @SuppressWarnings("serial")
    public class Emp implements Serializable{
    	private Integer empno ;
    	private String ename ;
    	private Double sal ;
    	private Date hiredate;
    	private Dept dept ;
    	public Date getHiredate() {
    		return hiredate;
    	}
    	public void setHiredate(Date hiredate) {
    		this.hiredate = hiredate;
    	}
    	public Integer getEmpno() {
    		return empno;
    	}
    	public void setEmpno(Integer empno) {
    		this.empno = empno;
    	}
    	public String getEname() {
    		return ename;
    	}
    	public void setEname(String ename) {
    		this.ename = ename;
    	}
    	public Double getSal() {
    		return sal;
    	}
    	public void setSal(Double sal) {
    		this.sal = sal;
    	}
    	public Dept getDept() {
    		return dept;
    	}
    	public void setDept(Dept dept) {
    		this.dept = dept;
    	}
    	@Override
    	public String toString() {
    		return "Emp [empno=" + empno + ", ename=" + ename + ", sal=" + sal + ", hiredate=" + hiredate + ", dept=" + dept
    				+ "]";
    	}
    }
    

    编写Dept的VO类:

    package cn.liang.vo;
    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    public class Dept implements Serializable {
    	private Integer deptno ;
    	private String dname ; 
    	public Integer getDeptno() {
    		return deptno;
    	}
    
    	public void setDeptno(Integer deptno) {
    		this.deptno = deptno;
    	}
    
    	public String getDname() {
    		return dname;
    	}
    
    	public void setDname(String dname) {
    		this.dname = dname;
    	}
    
    	@Override
    	public String toString() {
    		return "Dept [deptno=" + deptno + ", dname=" + dname + "]";
    	}
    	
    }
    
    • 由于日期的参数传递需要有一个转换器来控制
    • 转换器是一个公共的配置,所以需要Action去继承一个父类的Action

    编写AbstractAction类:

    package cn.liang.util.action;
    import java.text.SimpleDateFormat;
    import org.springframework.beans.propertyeditors.CustomDateEditor;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.InitBinder;
    
    public abstract class AbstractAction { 
    	@InitBinder	
    	public void initBinder(WebDataBinder binder) {	// 方法名称自己随便写
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
    		// 本方法的处理指的是追加有一个自定义的转换编辑器,如果遇见的操作目标类型为java.util.Date类
    		// 则使用定义好的SimpleDateFormat类来进行格式化处理,并且允许此参数的内容为空
    		binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(sdf, true));
    	} 
    }
    

    编写测试程序:

    package cn.liang.action;
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import cn.liang.util.action.AbstractAction;
    import cn.liang.vo.Emp;
    @Controller
    @RequestMapping("/pages/emp/*") 
    public class EmpAction extends AbstractAction{
    	private Logger log = Logger.getLogger(EmpAction.class) ;
    	@RequestMapping("add")
    	public ModelAndView add(Emp emp) {	// 此时作为一个参数,并且没有实例化
    		log.info(emp); 
    		return null ; 
    	}
    }
    

    测试url:

    http://localhost:8080/springdemo/pages/emp/add.action?empno=100&ename=liang&sal=100.12&hiredate=1999-12-12%2012:23:12&dept.deptno=30&dept.dname=dv
    
    输出结果:
    2018-12-07 14:48:37,706 INFO [cn.liang.action.EmpAction] - Emp [empno=100, ename=liang, sal=100.12, hiredate=Sun Dec 12 12:23:12 CST 1999, dept=Dept [deptno=30, dname=dv]]
    

    配置资源文件

    • Spring MVC针对资源文件可以通过配置的模式实现

    编辑三个资源文件

    • Message.properties:
    vo.edit.msg = {0} u4fe1u606fu7f16u8bd1u5b8cu6210uff01
    
    • Pages.properties:
    emp.add.page=/pages/back/emp/emp_add.jsp
    
    • Validations.properties:
    emp.add.rules=empno:int|ename:string|sal:double|hiredate:date
    

    配置applicationContext-mvc.xml文件

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    	<property name="basenames">
    		<array>
    			<value>Messages</value>
    			<value>Pages</value>
    			<value>Validations</value>
    		</array>
    	</property> 
    </bean>
    

    在公共类AbstractAction类进行自动注入的配置模式

    package cn.liang.util.action;
    import java.util.Locale;
    import javax.annotation.Resource;
    import org.springframework.context.MessageSource;
    public abstract class AbstractAction {
    	@Resource
    	private MessageSource msgSource ;	// 表示此对象直接引用配置好的类对象(根据类型匹配)
    	/**
    	 * 根据指定的key的信息进行资源数据的读取控制
    	 * @param msgKey 表示要读取的资源文件的key的内容
    	 * @return 表示资源对应的内容
    	 */
    	public String getValue(String msgKey,Object ...args) {
    		return this.msgSource.getMessage(msgKey, args, Locale.getDefault()) ;
    	} 
    }
    

    编写测试方法:

    package cn.liang.action;
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import cn.liang.util.action.AbstractAction;
    @Controller
    @RequestMapping("/pages/emp/*") 
    public class EmpAction extends AbstractAction{
    	private Logger log = Logger.getLogger(EmpAction.class) ;
    	
    	@RequestMapping("info")
    	public ModelAndView info() {
    		log.info(super.getValue("vo.edit.msg", "雇员"));
    		log.info(super.getValue("emp.add.page"));
    		log.info(super.getValue("emp.add.rules"));
    		return null ;
    	}
    }
    

    测试url:

    http://localhost:8080/springdemo/pages/emp/info.action
    
    输出结果:
    2018-12-07 15:20:22,107 INFO [cn.liang.action.EmpAction] - 雇员 信息编译完成!
    2018-12-07 15:20:22,110 INFO [cn.liang.action.EmpAction] - /pages/back/emp/emp_add.jsp
    2018-12-07 15:20:22,113 INFO [cn.liang.action.EmpAction] - empno:int|ename:string|sal:double|hiredate:date
    
  • 相关阅读:
    Promise原理实现(一):前置知识点
    移动端禁用缩放
    多条命令同时执行的包concurrently
    通过面试题学JavaScript知识(1)
    移动设备适配
    css 文本溢出显示省略号
    变量对象的理解
    7.10 日志
    7.9 日志
    JMETER接口测试之自动化环境的配置
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/10083426.html
Copyright © 2020-2023  润新知