接收用户输入:
传统的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>
运行截图:
这种方式类似于第一种领域对象模型的方式。
这就是常见的三种接收用户输入的方式。