struts2的HelloWorld的基本过程
login.jsp中
<form action="Login"...
该页面提交后,
web.xml中设置的过滤器会起作用
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
调用用户开发的action来处理用户请求,事先在struts.xml中设置:
(struts.xml文件是Struts框架的核心文件,主要负责管理Struts2框架的业务控制器Action)
<struts>
<package name="lee" extends="struts-default">
<action name="Login" class="lee.LoginAction">
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
name为Login的action会调用对用lee.LoginAction类来处理,LoginAction类中
execute()方法会返回SUCCESS或者ERROR的final String,这些字符串常量在Action接口中被事先定义,
(上面的LoginAction类没继承Action)
<result name="success">/welcome.jsp</result>
即execute()方法返回字串为success时,struts会把welcome.jsp发送给客户,
Struts2的Action是一个POJO
public String execute() throws Exception
{
String user = (String)ActionContext.getContext().getSession().get("user");
if (user != null && user.equals("scott"))
{
BookService bs = new BookService();
setBooks(bs.getLeeBooks());
return SUCCESS;
//在实际项目中,不会在控制器中直接创建业务组件,而是通过工厂模式管理业务逻辑组件实例
//Spring中使用依赖注入
}
<%@ taglib prefix="s" uri="/struts-tags"%>@taglib表明引用标签。类似java中的import语句prefix="s" 引用的名称在页面可以使用,
就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx/>就可以了,uri="/struts-tags"%表示标签库的路径。相当于import一个具体的类~
public class LoginAction extends ActionSupport
{
private String username;
private String password;
。。。
public String execute() throws Exception
public void validate()
{
if (getUsername() == null || getUsername().trim().equals(""))
{
addFieldError("username", getText("user.required"));
}
if (getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password", getText("pass.required"));
}
}}
ActionSupport类是一个工具类,它实现了Action接口,它还实现了Validatable接口,提供了数据校验功能。
通过继承ActionSupport类,可以简化Action的开发,validate()方法会在execute()方法之前被执行,
若validate()执行之后,FieldError不为空,则请求会被转发给input逻辑视图,
其他地方都没有改动,而能够在返回给用户的html页面提示出错信息,这是因为struts2的<s:form..>和表单控件已经提供了输出校验错误的能力
大量的validate()方法比较烦人,struts2提供了定义配置文件的方法来完成数据校验,
struts2的业务逻辑控制器 不会对用户请求做任何实际处理,用户请求最终由 模型组件处理,业务控制器只是中间负责调度的调度器
核心过滤器StrutsPrepareAndExecuteFilter加载struts2框架(负责拦截所有用户的请求)
->转发请求给Action->调用模型组件
Struts2的工作原理
(1)客户端向Servlet容器(如Jetty、Resin或tomcat等)发送请求。
(2)该请求首先经过一个标准的过滤器链,过滤器链包括可选的ActionContextCleanUp过滤器等。
(3)核心过滤器StrutsPrepareAndExecuteFilter(FilterDispatcher)被调用,该过滤器依次查找ActionMapper来决定这个请求是否调用用户请求的action。
(4)如果ActionMapper决定调用Action,StrutsPrepareAndExecuteFilter(FilterDispatcher)把请求的处理控制器交给ActionProxy。
(5)ActionProxy向ConfigurationManager询问框架的配置文件struts.xml找到要调用的Action类。
(6)ActionProxy创建ActionInvocation实例,负责命令模式的实现。
(7)在调用Action之前调用拦截器。
(8)在Action执行后,ActionInvocation负责根据Action的返回结果在struts.xml配置文件中找对应的视图资源。
(9)执行返回的结果,返回的结果通常是JSP或者FreeMarker模版,也可能是Action。模版可以使用框架提供的Struts2标签。
(10)拦截器再次被执行(顺序和Action被调用之前的执行顺序是相反的)。
(11)响应通过web.xml文件中配置的过滤器(Struts2核心控制器)返回
struts2的HelloWorld的基本过程的更多相关文章
- Struts2 拦截器具体配置过程
拦截器差点儿遍布每个程序中,所以贴出拦截器配置的具体过程,希望可以帮到大家. Struts2 拦截器具体配置过程 <interceptors> <!-- 先定义拦截器 --> ...
- 使用maven+eclipse搭建最简单的struts2的helloworld
使用maven+eclipse搭建最简单的struts2的helloworld 一.web分层结构简介 1.web[细]粒度分层结构: 按细粒度分层可以分为以下6种: 1).表现层:html/css/ ...
- 转载 - Struts2 拦截器详细配置过程
出处:http://www.blogjava.net/zzzlyr/archive/2009/10/12/297998.html Struts2 拦截器详细配置过程 1:所有拦截器的超级接口Inter ...
- Struts2拦截器的执行过程浅析
在学习Struts2的过程中对拦截器和动作类的执行过程一度陷入误区,特别读了一下Struts2的源码,将自己的收获分享给正在困惑的童鞋... 开始先上图: 从Struts2的图可以看出当浏览器发出请求 ...
- Struts2之HelloWorld
首先既然是开发Struts程序的话,那么自然需要用到Struts2开发包,Struts2是apache旗下的开源框架,所有的开发包和源代码都可以在Apache官网下载. 那么,就来开始编写第一个Str ...
- 创建一个struts2的HelloWorld
1.下载struts2的jar包 http://struts.apache.org/download.cgi#struts255 下载一个稳定版本Struts 2.3.31 里面提供了maven ja ...
- Struts2 的 helloworld
配置步骤: 1.在你的strut2目录下找到例子项目,把它的 lib 下的jar拷贝到你的项目.例如我的:struts-2.3.24\apps\struts2-blank 2.struts-2.3.2 ...
- 使用MyEclipse 9.0 创建 struts2 的HelloWorld 工程
作为眼高手低的典范,必须痛改前非,好好动手多做开发! 本文是struts2的入门指导,权当笔记! 在MyEclipse中,配置Apache tomcat 7.x 服务器 创建新的Web project ...
- 2.第一个Struts2程序-HelloWorld程序
1.新建Web Project项目:Study_Struts2 2.新建HelloWordAction.java类 3.复制struts.xml文件到src目录下,配置struts.xml文件内容如下 ...
随机推荐
- 基于Java Mina 和Netty 通信框架的JT/T809转发服务器设计
Apache MINA 是 Apache 组织的一个开源项目,为开发高性能和高可用性的网络应用程序提供了非常便利的框架. 也是Java开发者的一个福利(.NET目前还没有类似封装的这么好的基础sock ...
- js从数组中提取数字
某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的 ...
- Hive分析窗体函数之SUM,AVG,MIN和MAX
行 AVG(pnum) OVER(PARTITION BYpolno ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOW ...
- Dreamhost 提示No input file specified. 的解决的方法
假设开启FastCGI模式,.htaccess无法生效,一直提示no input file specified. 由于在Fastcgi模式下.php不支持rewrite的目标网址的PATH_INFO的 ...
- jQuery 实战读书笔记之第二章:选择元素
基本选择器 html 代码如下,后面的 js 使用的 html 基本大同小异. <!doctype html> <html> <head> <title> ...
- 嵌入式驱动开发之dsp 算法优化vlib emcv---算法优化
http://www.opencv.org.cn/forum.php?mod=forumdisplay&fid=9
- ShadowCaster 代码
Pass { Name "ShadowCaster" Tags{"LightMode" = "ShadowCaster"} CGPROGRA ...
- iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码
开发的过程中,肯定会用到在视图想上滑动的时候,在导航处做一些操作,比如向上滑动的时候,做个动画,出现一个搜索框,或者其他的操作,那么我们怎么来判断它的滑动方向呢? 首先我们应该知道tableview继 ...
- Volley 源码分析
Volley 源码分析 图片分析 要说源码分析,我们得先看一下官方的配图: 从这张图中我们可以了解到 volley 工作流程: 1.请求加入优先队列 2.从缓存调度器中查看是否存在该请求,如果有(没有 ...
- 《Sqlserver》通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败。错误:“驱动程序收到意外的登录前响应。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受
1. 点击 开始 --> 所有程序 --> Microsoft SQL Server2005 --> 配置工具-->SQL Server configuration Manag ...