Struts 2
是一种MVC框架。
Struts 2
框架中的处理大概分为以下几个步骤:
客户端初始化一个指向Servlet容器的请求;
这个请求经过一系列的过滤器(Filter)后,核心控制器
FilterDispatcher
根据请求询问ActionMapper
来决定这个请求是否需要调用某个Action。如果ActionMapper
决定需要调用某个Action,FilterDispatcher
把请求的处理交给ActionProxy
。ActionProxy
通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。ActionProxy
创建一个ActionInvocation
的实例。ActionInvocation
实例使用命令模式调用,回调Action的execute
方法,该方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。在调用Action的过程前后,将涉及到相关拦截器的调用。当Action执行完毕后,
ActionInvocation
会根据 struts.xml 中的配置找到对应的返回结果并将其输出到浏览器中,可以是HTML页面、图像,也可以是文档。此时支持的视图技术非常多。
实现一个Struts 2
应用,只需要配置 struts.xml 文件,编写Action代码和相关视图资源文件。
struts 2
配置文件:
配置文件是用户视图(View)和业务逻辑模块(Model)Action之间的桥梁。
- 配置Action的
struts.xml
文件, - 配置
Struts 2
全局属性的struts.properties
文件
一个实例:
配置好开发环境,安装好Struts(将所需要的jar包放入相应位置)。
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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts 2.0 应用项目</display-name>
<filter>
<filter-name>struts2</filter-name>
<!-- filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class-->
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
设计动作控制类
package com.struts2.app;
public class UserLoginAction {
//下面是Action用于封装用户请求参数的两个属性
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String password) {
this.pass = password;
}
//处理用户请求的execute方法
public String execute() throws Exception {
if("admin".equals(getName()) && "12345".equals(getPass())) {
return "success";
}
else if(getName()==null || getPass()==null) {
return "input";
}
else return "error";
}
}
配置Action类: Struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--include file="struts-default.xml" /-->
<!-- Struts 2 的Action必须放在指定的包空间下定义 -->
<package name="struts" extends="struts-default">
<action name="UserLogin" class="com.struts2.app.UserLoginAction">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
设计视图:JSP视图
- index.jsp
<%@page language="java" import="java.util.*" pageEncoding="GBK" %>
<html>
<head>
<title>Struts 2 Demo</title>
</head>
<body>
<form action="UserLogin.action" method="post">
<table align="center">
<caption><h4>用户登录信息</h4></caption>
<tr>
<td>用户名:<input type="text" name="name" /></td>
</tr>
<tr>
<td>密 码:<input type="password" name="pass" /></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="登 录" /><input type="reset" value="清 除" /></td>
</tr>
</table>
</form>
</body>
</html>
- welcome.jsp
<%@page language="java" import="java.util.*" pageEncoding="GBK" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>登录成功页面</title>
</head>
<body>
您已成功登录本系统!
<li><a href="<s:url action="UserLogin" />">重新登录</a></li>
<br>
</body>
</html>
- error.jsp
<%@page language="java" import="java.util.*" pageEncoding="GBK" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<% String path=request.getContextPath(); String basePath=request.getScheme()+"://"+request.getServerName()+
":"+request.getServerPort()+path+"/"; %>
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
您输入的用户名或密码错误,请重新输入
<br><li><a href="<s:url action="UserLogin" />">Sign on</a></li>
</body>
</html>
实例过程总结
login.jsp
(页面内跳转地址,struts拦截) ===> struts.xml
(指定并调用Action类,以及不同结果下返回的视图界面)===>UserLoginAction.java
(execute方法,返回值)===>struts.xml
(获得返回值,调用视图)
可以看出,整个过程和servlet十分相似。只不过servlet使用web.xml
映射java文件和路径,这里是用struts.xml
(当然前提是在web.xml中有struts配置)。另外,servlet是直接用java文件返回其视图的;而这里通过三个jsp视图文件处理不同情况下的视图。这样,即将视图层与控制层分开。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。