二、通过《用户登录案例》学习struts2框架的应用
使用Struts 2 开发“用户登录”的基本步骤:
1、加载Struts2 类库
2、配置web.xml
3、开发视图层页面
4、开发控制层Action
5、配置Struts 2的配置文件(struts.xml)
6、部署、运行项目
第一步:加载Struts2 类库:
从官方下载下来的lib目录中有很多jar包,有些jar不是我们程序必须的,没必要加载进来,只需加载项目需要的即可,从而减少程序的开销。
那么哪些jar是我们必须的呢?参看官方下载的apps文件夹中的struts2-blank这个示例程序。这个示例程序提供的Jar就是项目需要的基本jar包。
第二步:配置web.xml:
核心控制器, 需要在web.xml中进行配置,对框架进行初始化,以及处理所有的请求。
注意:struts2不同版本的核心控制器是不同的,如:
2.0版本的核心控制器为org.apache.struts2.dispatcher.FilterDispatcher;
2.1之后的版本普遍采用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意:该过滤器filter可以包含一些初始化参数,经常使用的如config指定要加载的XML形式的配置文件列表(多个配置文件以逗号分隔),如果没有设置这个参数,会自动加载classes目录下的struts.xml配置文件。
该过滤器会过滤用户请求,如果用户请求以action结尾,则该请求将被输入struts2框架进行处理。
第三步:开发视图层页面-index.jsp、success.jsp
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login page</title>
</head>
<body>
<div>
<s:fielderror name="errormsg" cssStyle="color:red"/>
</div>
<s:form action="login.action">
<div>
<s:textfield name="username" label="用户名"/>
</div>
<div>
<s:password name="password" label="密码"/>
</div>
<s:submit value="提交" />
</s:form>
</body>
</html>
在开发页面时我们应用struts2标签,在使用struts标签时需要注意以下几点:
1、必须引入struts的标签库 <%@taglib prefix="s" uri="/struts-tags"%>
2、struts2的标签都是以"s"为前缀的。
3、可以选择用struts2的UI标签实现页面效果
<s:textfield name="username" label="用户名"/>
注意:我们运行项目查看源代码时发现,生成了如下的html代码,通过表格来固定的画面的样式。
<tr>
<td class="tdLabel">
<label for="login_username" class="label">用户名:</label>
</td>
<td>
<input type="text" name="username" value="" id="login_username"/>
</td>
</tr>
如果上述效果不是你所需要的,那么你可以通过更改struts2的页面默认主题(xhtml风格)为simple,这样就可以根据自己的需要设计页面的布局。在struts.xml中添加如下代码即可。 <constant name="struts.ui.theme" value="simple"/>
public class LoginAction extends ActionSupport{
private String username;
private String password;
private final String LOGINUSER = "";
public String execute(){
return SUCCESS;
}
public void validate(){
if("yanln".equals(username)&& "12345".equals(password)){
Map usermap = ActionContext.getContext().getSession();
usermap.put(LOGINUSER, username);
}else{
this.addFieldError("errormsg", "用户名或密码错误");
}
}
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;
}
}
开发Action的方式:
(1)、实现Action接口——接口中有execute方法及5个常量success none error input login
(2)、继承ActionSupport类——可以做数据验证
(3)、普通的Java类 ——只要有一个返回String类型的无参的公共的execute方法.
注意:实际开发中,Action类通常都继承ActionSupport类,以便简化开发。
下面对LoginAction程序说明一下:
1、LoginAction继承了ActionSupport类,重写validate方法做数据验证,重写execute方法做验证通过后的处理。
2、程序首先执行validate方法进行数据验证,如果用户名和密码不满足要求,通过addFieldError("errormsg", "用户名或密码错误");方法设置错误信息内容,在结果跳转时,会找到struts.xml文件中指定input值,来决定跳转到哪个页面。特殊说明:struts2内设数据校验失败时会自动跳转到name为input的<result/>
<result name="input">index.jsp</result>
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute(LOGINUSER, username);
(2)、松耦合的访问方式:Map usermap = ActionContext.getContext().getSession();
usermap.put(LOGINUSER, username);
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute(){
return SUCCESS;
}
<struts> <package name="example" namespace="/" extends="struts-default"> <action name="login" class="com.yanln.test.action.LoginAction"> <result name="success">success.jsp</result> <result name="input">index.jsp</result> </action> </package> </struts>
Struts.xml核心配置文件,主要负责管理Action。通常放在WEB-INF/classes目录下,在该目录下的struts.xml文件可以被自动加载。(也可以放到src根目录下)
<struts> <constant name="" value=""/> <package name="" namespace="" extends=""> <action name="" class=""> <result name=""></result> </action> </package> </struts>
constant元素:
用于配置常量,可以改变Struts 2框架的一些行为;name属性表示常量名称,value属 性表示常量值 。如: <constant name="struts.ui.theme" value="simple"/>
package元素 :
包的作用:简化维护工作,提高重用性
包可以“继承”已定义的包,并可以添加自己包的配置
name属性为必需的且唯一,用于指定包的名称
extends属性指定要扩展的包
namespace属性定义该包中action的命名空间 ,为可选属性
action元素:用来指定业务逻辑处理的Action
result元素:用来配置请求返回的结果页
注意:除非有令人信服原因,自定义的包应该总是扩展struts-default包,因为该包中配置了大量常用的struts2的特性,没有这些连简单的在action中获取请求数据都无法完成。
struts-default.xml
Struts 2默认配置文件,会自动加载
struts-default包在struts-default.xml文件中定义
struts-plugin.xml
Struts 2插件使用的配置文件
如果不开发插件,不需要编写该配置文件
加载顺序
struts-default.xml—>struts-plugin.xml—>struts.xml
第六步:部署、运行项目
第一个图标部署项目到tomcat上、第二个图标是启动tomcat