登录例子
步骤一,新建struts2_login项目,并导入struts2的六个基本jar包。
struts2-core-2.1.6.jar :开发的核心类库
freemarker-2.3.13.jar :struts2的UI标签的模板使用freemarker编写
commons-logging-1.0.4.jar :日志包
ognl-2.6.11.jar :对象图导航语言,通过它来读写对象属性
xwork-2.1.2.jar :xwork类库,struts2在其上进行构建
commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此jar包
特别需要说明的是目前strust2的最新版本是struts-2.1.6,它作为2.1.X的正式版。特别要注意导入commons-fileupload-1.2.1.jar包,%在此jar包中包含了RequestContext类,如果不导入该jar包将会报异常。
步骤二,建立LoginAction文件,主要代码如下:
package com.yzx.web.action; import com.opensymphony.xwork2.Action; public class LoginAction implements Action { private String username; private String passsword; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPasssword() { return passsword; } public void setPasssword(String passsword) { this.passsword = passsword; } @Override public String execute() throws Exception { // TODO Auto-generated method stub if (username.equals("1")) return "loginSuccess"; else return "loginFailure"; } }
说明:实现了Action接口,主要是为了保证execute的正确定义,其实我们也可以不实现此接口,只要能保证execute方法书写的正确书写(方法名,返回值)。
步骤三,在struts.xml文件中注册LoginAction。此配置文件要放在src目录下,实质就是成为classpath环境变量下的文件。主要代码如下:
<?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> <package name="myFirst" namespace="/" extends="struts-default"> <!-- login.jsp中的<form action=...>属性值就会参照此name属性。 --> <action name="login" class="com.yzx.web.action.LoginAction"> <!-- result的name对应的是LoginAction里面的execute里返回的值 --> <result name="loginSuccess">/success.jsp</result> <result name="loginFailure">/failure.jsp</result> </action> </package> </struts>
说明:package后面会有详细说明。action元素中的name属性值指定了此action所指定的请求路径为“login.action”。后面login.jsp中的<form action=...>属性值就会参照此name属性。
步骤四、提供jsp页面
login.jsp主要代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>登录</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> request.getContextPath():是为了解决相对路径的问题,可返回站点的根路径 <form action="<%=request.getContextPath()%>/login.action" method="get"> 户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="login"> </form> </body> </html>
failure.jsp主要代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <body> 这一句<%@ taglib prefix="s" uri="/struts-tags"%>就是从地址/struts-tags下面寻找标签库,它定义在Struts 2库文件struts2-core-2.0.11.jar里面的文件META-INF/struts-tags.tld里面。 <br> 登录失败,错误的用户名: <s:property value="username" /> <br> <a href="<%=request.getContextPath()%>/login.jsp">返回</a> </body> </html>
说明:使用了标签库,在struts2中使用标签库非常简单,只需要像上面那样导入标签库便可以使用所有的struts2的所有标签
success.jsp主要代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 登录成功! </body> </html>
步骤五、配置web.xml。完成核心监听器注册。内容如下:
说明:注释掉的部分为以前2.1.4版本中用的核心filter类。StrutsPrepareAndExecuteFilter类的init方法将会读取类路径下默认的配置文件struts.xml,并以javabean形式存放在内存中,以后struts2对用户的每次请求将使用内存中数据,而不是重读struts.xml文件。
步骤六、发布测试。
简要分析执行流程:
当输入login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,查找到此action便交给其处理,LoginAction内部会执行execute方法,并返回结果result(result也是参照的struts.xml中action下的result配置)。 关于表单传参,主要是参照的action中的方法名,而非属性名。
工程图:
效果图: