mint mvc的参数

mint mvc的action 方法是有参数的,在action执行之前,它的参数的会被mint mvc初始化,这样就不用开发者从request中获取参数一个个处理。

mint mvc初始化action参数的机制有四种:

  1. 用url初始化action参数
  2. 用请求参数初始化action参数
  3. 用HttpServletRequest对象的属性初始化action参数
  4. “内置参数”初始化action参数

以下将就这四点进行讲解,并且假设:

  1. 你网站域名是http://localhost/mintdemo
  2. 你的action类的url匹配是“/test”

用url初始化action参数

在声明action方法时,可以在Mapping注解的urls参数中,用"{}"指明url中某个部分作为参数。比如:

@Mapping(urls="/book/{bookId}")
public Integer book(Integer bookId){
	return bookId;
}

当访问者以“http://localhost/mintdemo/test/book/1234455”访问此方法时,bookId的值将是1234455。

这种获取参数的方式是模拟spring mvc的,很简单,很好理解,功能比较有限。

用表单参数初始化action参数

这种方式背后的原理就是,使用ServletRequest的getParameter()方法获取参数。请求参数来源包括url参数和表单提交的参数。mint mvc会根据请求参数名和action方法参数名的对应关系,利用请求参数初始化action方法参数。

采用该方式能初始化的参数类型目前包括:基础类型的包装类(包括String),数组和简单bean类。这里有一个约定敬请留意:所有基础类型参数必须使用对应的包装类,比如int类型必须写成Integer,否则对应的方法将是无效的action方法

初始化基础类型参数

这种情况很直观,也很简单,使用方法如下

action方法:

@Mapping(urls="/book", method="post")
public String blog(String bookName, Integer bookId){
	return bookName+"|"+bookId;
}

对应表单:

<!DOCTYPE html>
<meta charset="UTF-8">
<form action="test/book" method="post">
	书id:<input name="bookId"/><br/>
	书名:<input name="bookName"/>
	<button type="submit">提交</button>
</form>

输入:


输出:

初始化数组类型参数

如果action方法中有个参数是"String[] something",那么你的表单对应的参数命名可以是 "something"或者"something[]",这两种命名都可以被识别为数组参数,但是这两种命名方式不能在一个表单同时存在,否则只有其中一种命名方法的参数能够被接受到,具体情况看实际传送参数的顺序。

敬请注意:只有基础类型(包括String)的数组才能被初始化。

action方法:

@Mapping(urls="/books")
public String blogs(String[] bookTitles){
	String result = "";
	
	for(String title : bookTitles){
		result += (title+" | ");
	}
	
	return result;
}

对应表单:

<!DOCTYPE html>
<meta charset="UTF-8">

<fieldset style="float:left;">
	<legend>简单数组参数名</legend>
	<form action="test/books" method="post">
		<input name="bookTitles" type="checkbox" value="黑客与画家"/>黑客与画家<br/>
		<input name="bookTitles" type="checkbox" value="浪潮之巅"/>浪潮之巅<br/>
		<input name="bookTitles" type="checkbox" value="认识商业"/>认识商业<br/>
		<input name="bookTitles" type="checkbox" value="简单逻辑学"/>简单逻辑学<br/>
		<button type="submit" >提交</button>
	</form>
</fieldset>

<fieldset style="float:left;">
	<legend>带有"[]"的数组参数名</legend>
	<form action="test/books" method="post">
		<input name="bookTitles[]" type="checkbox" value="黑客与画家"/>黑客与画家<br/>
		<input name="bookTitles[]" type="checkbox" value="浪潮之巅"/>浪潮之巅<br/>
		<input name="bookTitles[]" type="checkbox" value="认识商业"/>认识商业<br/>
		<input name="bookTitles[]" type="checkbox" value="简单逻辑学"/>简单逻辑学<br/>
		<button type="submit" >提交</button>
	</form>
</fieldset>

输入:

输出:

初始化简单bean类参数

bean内所有需要自动初始化的字段,必须添加setter方法,并且这些字段的类型是基础类型(包括String)。比如下面这个bean:

package demo;

public class User {
	private String id;
	private String username;
	private String password;
	private int gender;
	private String[] emails;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getGender() {
		return gender;
	}
	public String[] getEmails() {
		return emails;
	}
	public void setEmails(String[] emails) {
		this.emails = emails;
	}
}

User的gender字段因为没有添加setter方法,mint mvc不会为他赋予任何值;而emails字段虽然有setter方法,但是它不是基础类型,所有也不会被mint mvc初始化。

想初始化一个bean类的后台参数的话,前台的表单参数名应该是这样的:[action参数名].[字段名]。例如某action中有一个这样的一个参数:User user,那么表单里对应文本域的名字就是:user.username。

下面以示例说明用法:

action方法:

@Mapping(urls="/register", method="post")
public String register(User user){
	return "账户:"+user.getUsername()+"<br/>"+
		"密码:"+user.getPassword()+"<br/>"+
		"性别:"+user.getGender()+"<br/>"+
		"邮件:"+user.getEmails();
}
对应表单:
<!DOCTYPE html>
<meta charset="UTF-8">
<form action="test/register" method="post">
	账号:<input name="user.username"/><br/>
	密码:<input name="user.password"/><br/>
	性别:<input name="user.gender"/><br/>
	邮件:<input name="user.emails"/>
	<button type="submit" >提交</button>
</form>
输入:

输出:

用HttpServletRequest对象的属性初始化action参数

request.setAttribute()方法可以在request对象中缓存一些自定义的数据, 这些数据在web容器内部流转,在整个请求处理阶段都有效,在需要的地方可以根据属性名字调用getAttribute()方法取出。mint mvc中也采用request内缓存的属性来初始化action的参数。

在整个请求的数据流当中,如果在action的上游(往往是Filter和Interceptor,Interceptor是拦截器,后面会详细讲)往request添加了属性,那么action中就可以声明同名同类型的参数来获取到。

首先定义一个action“上游”,负责往request中添加属性:

package demo;
import javax.servlet.http.HttpServletRequest;
import mint.mvc.annotation.InterceptorMapping;
import mint.mvc.annotation.InterceptorOrder;
import mint.mvc.core.ActionContext;
import mint.mvc.core.Interceptor;
import mint.mvc.core.InterceptorChain;
/**
 * @author LW
 */
@InterceptorOrder(0)
@InterceptorMapping(urls={"/test/login"})
public class LoginInterceptor extends Interceptor{
	public void intercept(ActionContext ctx, InterceptorChain chain) throws Exception {
		HttpServletRequest request = ctx.getHttpServletRequest();
		User user = new User();
		user.setUsername("琼羽");
		user.setPassword("somebody");
		
		request.setAttribute("user", user);
		chain.doInterceptor(ctx);
	}
}

然后定义action,取得request的属性:

@Mapping(urls="/login")
public String login(User user){
	return "账户:"+user.getUsername()+"<br/>"+
			"密码:"+user.getPassword()+"<br/>";
}
输出:

"内置参数"初始化action参数

jsp中有内置参数,mint mvc也借用了这种做法,将一些使用频率很高的参数设置为内置参数,以简化获取过程。目前支持的内置参数有三个:HttpServletRequest,HttpServletResponse,Session。以上几种参数初始化方式不同的,内置参数是根据参数类型初始化的,而不是根据参数的名字。比如:

@Mapping(urls="/logout")
public void logout(HttpServletResponse response){
	try {
		response.sendRedirect("index");
	} catch (IOException e) {
		e.printStackTrace();
	}
}
输入:

输出:

action参数的初始化是mint mvc的核心功能之一,欢迎尝试并提出意见。

本demo下载地址:http://git.oschina.net/895925636/mintdemo/tree/master

项目地址:http://git.oschina.net/895925636/mint-mvc

收录地址:http://www.oschina.net/p/mint-mvc

博客地址:http://www.wemakers.net/home/blog?cate=1001

(完)

转载于:https://my.oschina.net/cnlw/blog/323990

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值