Struts简介:
Struts是Apache公司提供的一个开源项目,目的是建立一个方便易用的MVC框架。本文对Struts框架的使用方式进行了简单介绍。
本文不打算讲解Struts的所有方面,因为那是不可能的,struts框架是一个功能很全面很复杂的架构。本文着重讲解如何使用struts来组织Web程序,更多更详细的内容可以参考struts官方提供的文档,或者看尚学堂提供的免费视频(本人更提倡查看官方文档)。
本次工程的目录如下:
实现的功能是模拟一个登陆界面,如下图所示:
当在用户名框中输入guanxinquan在密码框中输入gxq点击登陆,将会跳转到一个成功登陆界面。
否则,将进入错误界面.
功能很简单吧,下面就让我们进入Struts的神秘世界。
首先创建一个TO类,用来客户机和服务器之间传递信息。描述如下:
StudentLoginInfoTO.java
package com.guan.strutsTest.TO;
public class StudentLoginInfoTO {
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;
}
}
这个TO类,仅仅有userName和password两个字段,用来从前台获取登陆信息。
然后建立一个Action类,这个类用来相应前台的Http请求。
StudentLoginAction.java
package com.guan.strutsTest.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.guan.strutsTest.TO.StudentLoginInfoTO;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class StudentLoginAction extends ActionSupport implements ModelDriven<StudentLoginInfoTO>,SessionAware{
/*注意 实际中没有必要继承类ActionSupport,struts2版本后Action类可以不继承和不实现任何类,只需要强求相应函数返回一个字符串即可,稍后会解释这个返回字符串的作用,这里使用了系统默认的两个常量SUCCESS和ERROR因此继承了ActionSupport(实际中根据个人爱好选择是否继承这个类),后面实现的两个接口也不是必须的。ModelDriven接口用来将前台获取的数据赋值给一个具体的类中,但是这个过程必须满足一定的命名规则,就是说前台的标签名字要和后台类中的变量名相匹配。SessionAware接口用来处理需要ServletSession相关操作的接口,继承了这个接口,当前台传入数据时,会将Session一并传入到后台,在这个例子中,因为要记录登陆状态,所以需要设置一个Session属性,标示用户已经正确登陆*/
private static final long serialVersionUID = 1L;
private StudentLoginInfoTO studentLoginInfoTo = new StudentLoginInfoTO();//必须new一个对象,这样前台会将变量自动赋值进来
private Map<String,Object> session;//获取到前台的Session
public String studentLogin()
{
if("guanxinquan".equals(studentLoginInfoTo.getUserName())&&"gxq".equals(studentLoginInfoTo.getPassword())) {
/*判断用户名和密码是不是正确。注意比较是常量放在前面,这是习惯,当然也有其好处,如果您将变量放在前面,您需要先判断比较的变量是不是为空,要多写两条语句*/
this.session.put("loginUser", studentLoginInfoTo);
//将登陆的用户放到Session中,标示其登陆状态
return SUCCESS;//返回成功字符串(实际是success字符串)
}
else
return ERROR;//返回错误字符串(实际是error)
}
public StudentLoginInfoTO getModel() {
//ModelDriven接口唯一需要实现的函数,前台数据将赋值到您返回的变量中
return this.studentLoginInfoTo;
}
public void setSession(Map<String, Object> session) {
//SessionAware接口唯一需要实现的函数,接受前台传入的Session
this.session = session;
}
}
实际上,使用struts,前台传入的表达数据会自动赋值给后台Action的变量中,这样使用起来简单方便,这种映射需要遵守一定的规则,就是表单变量名和Action变量名必须匹配。
另外,如果您需要使用Servlet的一些内置变量,您需要实现一些接口来获取这些变量,例如RequestAware,SessionAware,ApplicationAware等。
Struts的配置文件:
在Struts中,您无需再将那些繁复的跳转配置在Web.xml中,可以简单的在Struts配置文档中完成。
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.1.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!—这里配置namespace为/下的Action,login Action中直接跳转到index.jsp -->
<action name="login">
<result>/index.jsp</result>
</action>
<!—studentLoginAction有点复杂,首先当前台请求这个Action时,Struts会将请求提交给StudentLoginAction的一个实例,并执行这个实例的studentLogin方法,最后根据method指定的方法的返回值来确定其跳转路径,这个字符串与我们的方法中的字符串必须对应-->
<action name="studentLoginAction" class="com.guan.strutsTest.action.StudentLoginAction" method="studentLogin">
<result name="success">/login_success.jsp</result>
<result name="error">/login_error.jsp</result>
</action>
</package>
<!-- Add packages here -->
</struts>
在Struts的配置文档中会很容易的配置跳转路径,并且采用Struts的通配符策略会使Struts的配置文档更简练。另外将不同功能的配置分开写成多个文档,更容易管理。
下面,需要在Web.xml中配置Struts的过滤器。
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank</display-name>
<filter>
<filter-name>struts2</filter-name>
<!—配置过滤器,将满足mapping的所有请求提交给StrutsPrepareAndExecuteFilter 进行处理-->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!—这里将所有的请求都提交给Struts过滤器处理,实际上一个架构中可以有多个过滤器,采用不同的前缀进行区分-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
最后是jsp文件,我就不多说了,大家一看就明白:
Login.jsp
<%@ page language="java" pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登陆</title>
</head>
<body>
<form action="studentLoginAction">
用户名:<input type="text" name="userName"/><br/>
密 码:<input type="password" name="password"><br/>
<input type="submit" value="登陆"/>
</form>
</body>
</html>
Login_success.jsp
<%@ page language="java" pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登陆成功!</title>
</head>
<body>
登陆成功<br>
</body>
</html>
Login_error.jsp
<%@ page language="java" pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登陆失败!</title>
</head>
<body>
用户名或密码错误! <br>
</body>
</html>
我要补充一下,如果您的jsp文件中现在还有大量的java代码,那么我将替您感到悲哀,那已经太过时了!!
最后,我简单描述一下整个请求和处理过程。当您填完表达,点击提交按键后,系统会去寻找http://localhost:8080/StrutsTest/studentLoginAction,tomcat将接受这个请求,除去前面的部分,剩下/studentLoginAction,tomcat查询web.xml文件,发现所有为/的请求都提交给Struts的过滤器处理,tomcat直接将这个请求交给Struts来处理。Struts接受到这个请求,分析其namespace是/而后找到叫studentLoginAction的Action,创建相应的类,并将前台传入的数据和类中的对应字段相赋值,然后执行method中指定的类中方法,执行完成后,方法会返回一个字符串,Struts根据返回的字符串查找其result集合,寻找与返回字符串相匹配的result,最终跳转到指定的界面,整个请求过程完成。
Struts使得轻量级客户端的web服务开发变得那么轻而易举,如果要实现富客户端需要使用Ajax或者flex等,我们会在稍后的章节中进行介绍。
最后要看看真个程序使用的jar包,可以从官网直接下载struts-2.1.8.1-all.zip,zip下包含了所有需要的包
这些jar包需要放在下图中的lib目录中。另外指定的配置文件要放在指定的位置。