一直在看struts2框架,但是却一直觉得并没有很好的理解的struts2框架的精髓,从今天开始,我决定要从新系统的再看一遍struts2。首先我们先用struts2实现一个简单的登录功能。
以下几个jar包可以实现基本的struts2框架功能:
Struts2框架的大概处理流程如下:
1、加载类(FilterDispatcher)
2、读取配置(struts配置文件中的Action)
3、派发请求(客户端发送请求)
4、调用Action(FilterDispatcher,最新几版是使用StrutsPrepareAndExecuteFilter从struts配置文件中读取与之相对应的Action )
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute()方法)
7、返回响应(通过execute方法将信息返回到FilterDispatcher)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROR,将跳转到哪个jsp页面)
9、响应用户(jsp—>客户浏览器端显示)
创建一个简单的struts2项目:
1、创建web项目(添加struts功能);
2、将struts依赖的jar包导入项目;
3、修改web.xml,添加主控制器(filter);
4、在struts.xml中配制出创建的action;(servlet在struts中叫action,action是一个普通的java类,其中有一个方法String execute();)
web.xml(配置主控制器信息)
struts.xml(配置action的信息)
基本原理:
用户输入用户名密码之后,点击提交按钮将存放数据的form表单提交给相应的action(这里是LoginAction),在该action中对用户输入的用户名和密码进行验证,根据验证结果跳转到相应的页面。
====实例解析===============================
1、LoginAction中有两个属性分别代表JSP表单的两个输入框。struts2会自动把输入框的内容通过getter.setter方法设置进来;另外一个execute()方法,这是struts2Action的主方法,提交数据后struts2会调用该方法读数据进行处理。返回值代表页面的名称,具体路径在配置文件中。
LoginAction.java
package com.lmb.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
private String account;//账号
private String password;//密码
/**
* 主方法:接收前台用户输入的数据,进行验证,然后根据验证结果进行相应的页面跳转
*/
@Override
public String execute(){
if("lmb".equalsIgnoreCase(account) && "1234".equals(password)){
return SUCCESS;//如果用户输入的用户名为"lmb",密码为"1234"则跳转到登录成功页面
}
return LOGIN;//否则跳转到登陆页面
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、struts.xml用来配置项目中定义的action的信息;struts2配置文件中引入了package的概念,所有的result、action等都必须要配置到package中。package具有继承的特性,字子package里的action能使用父package里的资源。自定义的package一般继承自struts-default,这里面包含了struts2的默认拦截器,比如从request中获取数据并设置到action上等工作都是由struts2拦截器完成的。
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="main" extends="struts-default"><!-- 定义一个package-->
<global-results> <!-- 所有的全局result-->
<result name="login">/login.jsp</result> <!-- 名为login的result-->
</global-results>
<action name="loginPerson" class="com.lmb.struts2.action.LoginAction">
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
3、struts2 中JSP是以 的形式配置的,相当于struts1中的”forward/“。代码中配置了两个JSP页面,一个是名为success的登录成功后的页面welcome.jsp,配置在名为loginPerson的”action/”里面;另一个是全局的input,配置在全局的“global-results”里面,所有的action都能引用该JSP。另外JSP中使用struts2标签来显示数据,有关struts2标签的描述本人会在后续博客中给出。
welcome.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="struts" %><!-- 标签库taglib声明 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录成功页面</title>
<struts:head theme="ajax"/><!-- 声明使用Ajax主题 -->
</head>
<body>
登录成功,欢迎你,<struts:property value="account"/><!-- 显示LoginAction中的account属性 -->
</body>
</html>
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="struts" %><!-- 标签库taglib声明 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登陆页面</title>
<struts:head theme="ajax"/><!-- 声明使用Ajax主题 -->
</head>
<body>
<struts:form action="loginPerson"> <!-- 将该form表单提交给 loginPerson-->
<struts:label value="登录系统"></struts:label><!-- 文字标签-->
<struts:textfield name="account" label="账号"></struts:textfield><!-- 文本输入框-->
<struts:password name="password" label="密码"></struts:password><!-- 密码输入框-->
<struts:submit value="登录"></struts:submit><!-- 提交按钮-->
</struts:form>
</body>
</html>
4、最后,在web.xml中配置分发器,struts1中使用ActionServlet作为分发器,而struts2中使用Filter作为分发器。如果有多个Filter,要把struts2的分发器Filter作为最后一个Filter。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<!-- struts2的Filter,所有的请求都被映射到struts2上 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- struts2的Filter的URI配置 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list> <!-- 欢迎文件列表-->
<welcome-file>index.jsp</welcome-file> <!-- 默认为index.jsp-->
</welcome-file-list>
</web-app>
这样,我的第一个struts2实例就够建好了,将其部署到Web服务器上,就能在浏览器中查看相应的运行效果了。其工作流程如下: