Struts2 学习总结(二):action接收用户输入的三种方式

 

接收用户输入:

传统的web方式通过HttpServletRequest的getParamerter(String name) 来获取用户输入,而框架都带有数据绑定机制,由框架从请求中获取数据并绑定到javabean中,Struts2提供的多种访问用户输入的方式,访问用户输入需访问ActionContext ,这种方式实现了与web层的完全解耦。

下面通过编写一个登录案例来介绍三种访问用户输入的方式:

一、使用领域对象接收用户输入:

1.如上例步骤创建项目,导入jar包,目录结构如图所示,步骤此处省略...

 2.创建login.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="login.action" method="post">
用户名:<input type="text"  name="user.username"><br>
密码:<input type="password" name="user.password"><br>
<input type="reset" value="重填"><br> 
<input type="submit" value="登陆">
</form>
</body>
</html>

3.创建模型对象User类:

package model;

public class User {
  private String username;
  private String password;
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;
}
  
}

4. 编写LoginAction 类:

package controller;

//使用领域模型来接受用户输入数据
import com.opensymphony.xwork2.Action;

import model.User;

public class LoginController1 implements Action {
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		if ("aaa".equals(user.getUsername()) && "123".equals(user.getPassword())) {
			return SUCCESS;
		}
		return ERROR;
	}

}

5.编写error.jsp和success.jsp:

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
登陆失败<br>
请重新<a href="login.jsp">登陆</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
 <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
登陆成功 欢迎
<s:property value="username"/>
</body>
</html>

 6.在struts.xml中注册控制类:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
	<package name="Controller"  extends="struts-default">
		<action name="login" class="controller.LoginController1" method="execute">
			<result name="success">/success.jsp</result>	
			<result name="error">/error.jsp</result>
			
		</action>

	</package>
</struts>  

运行截图:(有图有真相?)

运行正常,接下来我们会发现这样一个现象:

在这两行代码中使用了user对象,而在Action类中也没有对象的创建,按理说会报空指针异常的错误,但是并没有,这就是Struts2的神奇之处,它会在你使用user.username时调用Action类中的 getUser()   方法获取 user 对象,如果没有user对象便会调用setUser(new User())方法来创建一个对象,然后为其赋值。这就是Struts2自动实例化用于数据填充的javabean

二、使用action通过创建属性来接收用户输入,在一些简单应用中,无需创建模型对象,便可使用这种方式。

login.jsp代码修改如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="login.action" method="post">
用户名:<input type="text"  name="username"><br>
密码:<input type="password" name="password"><br>
<input type="reset" value="重填"><br> 
<input type="submit" value="登陆">
</form>
</body>
</html>

创建LoginAction1类如下:

package controller;

import com.opensymphony.xwork2.Action;

public class LoginAction1 implements Action {
    private String username;
    private String password;
	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;
	}
	@Override
	public String execute() throws Exception {
		if("aaa".equals(username)&&"123".equals(password)) {
			return SUCCESS;
		}
		return ERROR;
	}

}

struts.xml修改如下:(目的是修改控制类)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
	<package name="Controller"  extends="struts-default">
		<action name="login" class="controller.LoginAction1" method="execute">
			<result name="success">/success.jsp</result>	
			<result name="error">/error.jsp</result>
			
		</action>

	</package>
</struts>  

运行截图:

三、使用ModelDriven action

控制类编写如下:

package controller;
//使用ModelDriven接口来访问领域模型对象,使用username,而不是user.username,
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;

import model.User;

public class LoginAction implements Action, ModelDriven<User> {
    private User user =new User();
	@Override
	public String execute() throws Exception {
		if("aaa".equals(user.getUsername())&&"123".equals(user.getPassword())) {
			return SUCCESS;
		}
		return ERROR;
	}

	@Override
	public User getModel() {
		
		return user;
	}

}

此种方式无需提供user的set和get方法,但需自己创建对象,并实现getModel()方法

login.jsp修改如下(如果是从二下来就无需修改该页面):

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="login.action" method="post">
用户名:<input type="text"  name="username"><br>
密码:<input type="password" name="password"><br>
<input type="reset" value="重填"><br> 
<input type="submit" value="登陆">
</form>
</body>
</html>

struts.xml修改,注册控制类:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
	<package name="Controller"  extends="struts-default">
		<action name="login" class="controller.LoginAction" method="execute">
			<result name="success">/success.jsp</result>	
			<result name="error">/error.jsp</result>
			
		</action>

	</package>
</struts>  

运行截图:

这种方式类似于第一种领域对象模型的方式。

这就是常见的三种接收用户输入的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值