什么是框架?
框架的目的:降低开发成本,提升效率。
1)健壮性
2)扩展性
3)侵入性(尽量低,但不为0)
4)易用性
什么是Struts2 apache
Struts1:流行将近10年
WebWor-->核心:XWork
apache在XWork基础上重新写了Struts2
Result
Interceptor
//web配置
<!-- 配置Struts2提供的前端控制器-->
<welcome-file-list>
<welcome-file>index.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>
//src下的sruts.xml,其中method自定义方法要与action中的方法保持一致,默认的方法是execute
<struts>
<packagename="list" namespace="/" extends="struts-default">
<action name="list"class="action.costList" method="fa">
<resultname="success">/WEB-INF/jsp/costList.jsp</result>
</action>
</package>
</struts>
//action内容 这里的fa()方法要与struts.xml中的<actionmethod="">保持一致
public class LoginAction {
privateString user;
privateString pwd;
privateString errorMsg;
publicString getErrorMsg() {return errorMsg;}
publicvoid setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}
publicString getUser() {return user;}
publicvoid setUser(String user) {this.user = user;}
publicString getPwd() {return pwd;}
publicvoid setPwd(String pwd) {this.pwd = pwd;}
publicString fa(){
/*1 获取提交的user和pwd
* 2 调用model层的组件(例如DAO)验证user和pwd
* 3 如果是合法的用户return "success"
* 如果不是合法的用户return "fail"
*/
System.out.println(user+","+pwd);
if("goodman".equals(user)&&"12345".equals("pwd")){
returnnull;
}else{ errorMsg="用户名或者密码错误"; return"fail";}
}
}
编程原理
用户有发送http请求-->web服务器(tomcat)-->web.xml(web部署描述文件)-->执行struts核心控制器-->加载struts.xml,通过请求action名字找到匹配的action-->action类执行其中代码调用execute-->根据action所返回的result在struts.xml中执行<result="">转发dao页面返回给调用者
1 FC(前端控制器Front Contronner):站在最前面,接收所有请求 作用:拦截请求
2 Action:根据输入算输出
3 Result:负责把输出用适当的形式显示给用户
4 Interceptor(拦截器):在ACtion调用之前之后做点事
5 ValueStack:各个组件用于共享数据的容器
6 Tags:struts2特有的页面标签
OGNL:
OGNL的工作原理
发送请求到前端控制器FC,FC就会创建一个ValueStack用于存储共享数据,然后创建一个Action对象存放在ValueStack栈顶,之后调用拦截器进行拦截,调用拦截器可能会影响Action,调用Action对数据进行计算算出输出结果,最后调用result将结果以适当的形式输出。
Tags:
<s:debug/>
<s:property value=”user+’:’+errorMsg”/>
元素及属性的含义
Action元素:用于定义Action组件。
Name:必选属性,指定Action的名称。
Class:必选属性,指定Action的类型(包名.类名)。
Method:可选属性,指定Action中的业务方法名,默认为Execute.
Result元素:用于定义响应视图。
Name:必选属性,指定响应视图的名称。
Type:可选属性,指定响应视图的类型,默认为Dispatcher类型。
Action 有一个核心方法f()
ActionProxy 动态代理:
在程序运行的时候,请求先到前端控制器,前端控制器先调用actionproxy(action的动态代理),actionproxy会先调用一些要加到action中辅助功能的封装好的方法(即多个不同功能的拦截器),再调用核心方法f()(即调用action),它还可以接着调用result中的方法(即action再返回result,result用来决定数据以什么形式输出)
Action和ActionProxy都继承同一个接口
ActionInvocation :这个类用来封装整个调用过程中的信息
valueStack :值栈 用来存放调用过程中共享的信息的组件 这个API要用到OGNL.jar
我们可以写的是Action 还可以增加一些辅助功能通过增加拦截器和result