初学SSH框架,最好的办法就是多动手,在实践中去理解框架。下面用struts 2的框架搭建一个简单的登录示例,首先是框架的搭建,然后是代码的实现及配置,虽然例子简单,但是对于理解Struts 2有很好的作用。
首先开始准备工作,搭建Struts 2的框架。
1. 新建一个WebProject,工程名为Struts2_EXA。
2. 导入Struts 2框架,如果是比较新的IDE,通常有两种方法,一种通过IDE导入Struts 2框架,另一种可以到网上下载struts2的最新版本:http://struts.apache.org/download.cgi#struts20111。
下载struts2自少要保证有六个基本包:
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包
这些包的文件名在后面的版本号上可能会有出入。我的IDE是MyEclipse2014,自带有Struts 2, 可以通过右键点击新建的Web项目,“MyEclipse->Project Facets[Capabilities]->Install Apache Struts2.x Facet”来导入struts2框架
这个例子是通过MyEclipse自动导入的,喜欢自动动手的同学可以网上下载最新的Struts 2框架,将这六个组件包复制到Web工程下的WEB-INF/lib目录中,这些组件其实就是编译好的类文件。
3、接下来就是配置struts.xml文件。这个文件就好像起着一个过滤器的作用,用户发来的请求要经过该文件的过滤,根据用户请求中所请求的处理类型,来选择相应的处理逻辑。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE strutsPUBLIC "-//Apache SoftwareFoundation//DTD Struts Configuration 2.1//EN""http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="example" namespace="/example"extends="struts-default">
<action name="login"class="com.su.Login" method="execute">
<resultname="success">/WEB-INF/result/success.jsp</result>
<resultname="fail">/WEB-INF/result/fail.jsp</result>
</action>
</package>
</struts>
在struts.xml中,是采用package来管理各种action的。
package标签中的namespace指定了该包的命名空间。
extends是说当前这个包继承自struts-default包,可以在struts2-core-2.2.3.1.jar中的struts-default.xml文件中找到这个包,这个包被定义成抽象的,它不能包含有action。
包中的每一个action标签都和一个逻辑处理类进行了映射,name指定了这个action的名字,和包的namespace组合起来,可以直接访问这个逻辑处理类。
class指定了逻辑处理类的位置,如果不小心写错,浏览器会报404错误,method指定了进行逻辑处理类中进行逻辑处理的方法,这个execute很重要,而且它有固定的返回类型,就是String。
result标签就是根据逻辑判断之后,execute方法返回的字符串,根据返回的字符串,来进入到指定的页面。这里一定要把跳转的地址写清楚,明白。否则浏览器会报404的错误
3. 建立login.jsp文件:
<%@ page language="java"import="java.util.*" pageEncoding="GB18030"%>
<%
Stringpath = request.getContextPath();
StringbasePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<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>
<script type="text/javascript">
// 验证输入不为空的脚本代码
function checkForm(form)
{
if (form.username.value == "")
{
alert("用户名不能为空!");
form.username.focus();
return false;
}
if (form.password.value == "")
{
alert("密码不能为空!");
form.password.focus();
return false;
}
return true;
}
</script>
<body>
<form action="/Struts2_EXA/example/login" method="post" onSubmit="returncheckForm(this);">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录">
<input type="reset" value="重置">
</form> <!-- -->
</body>
</html>
这里的action就对应了struts.xml里面的action,action="/Struts2_EXA/example/login"这里的位置不能写错,否则会报404浏览器错误。
4. 建立success.jsp和fail.jsp,这两个文件放到/WEB-INF/result目录下
success.jsp的内容:
<%@ page language="java" import="java.util.*"pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>sucess</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>
登录成功! <br>
</body>
</html>
fail.jsp的内容:
<%@ page language="java" import="java.util.*"pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>failpage</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>
登录失败! <br>
</body>
</html>
5. 在src目录下,编辑Login类
package com.su;
public class Login {
private String userName = "success";
private String password;
public StringgetUserName() {
return userName;
//return"success";
}
public voidsetUserName(String userName) {
this.userName =userName;
}
public StringgetPassword() {
return password;
}
public voidsetPassword(String password) {
this.password =password;
}
public Stringexecute() {
if("suo".equals(this.userName)&& "123".equals(this.password))
return "success";
else
return "fail";
}
}
6. 配置web.xml。完成核心监听器注册
<?xml version="1.0"encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID" version="3.1">
<display-name>Struts2_EXA</display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
简要分析执行流程:当输入login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,查找到此action便交给其处理,LoginAction内部会执行execute方法,并返回结果result(result也是参照的struts.xml中action下的result配置)。 关于表单传参,主要是参照的action中的方法名,而非属性名。
经过上面几步,一个示例已经完成,启动Tomcat服务器,在地址栏输入http://locathost:8080/Struts2_EXA,进入登录界面,就可以开始你的操作了。