1.Struts各部分结构:
组织部分 | 作用 |
Struts-config.xml | Struts配置文件 |
ActionServlet | 控制器 |
Action Class | 包含事务逻辑 |
ActionForm | 显示模块数据 |
ActionMapping | 帮助控制器将请求映射到操作 |
ActionForward | 用来指示操作转移的对象 |
ActionError | 用来存储和回收错误 |
Struts标记库 | 可以减轻开发显示层次的工作 |
2.Struts 1的优缺点:
struts1的好处 | struts1的缺点 |
1.良好的架构和设计 | 1.它太过于依赖web容器,当配置文件改动一次就要重新启动。 |
3.一次请求的流程
1.以.do结尾的URL被ActionServlet拦截,执行service方法
2.根据请求传递的方法GET/POST选择执行doGet()或doPost()方法
3.在doGet()/doPost()方法中,调用process()方法
4.在process()方法中获得RequestProcessor的实例
5.RequestProcess的实例调用process()方法,处理请求
6.在RequestProcess的process()方法中,
首先通过processMultipart()处理请求。
若传送方法为get,不做处理,直接返回到process()方法
若传送方法为post,做简单处理后返回process()方法
其次通过processPath()方法获取path
若path为null,返回上一层调用
path不为null,接着进行其它处理
包括对Locale,Content,NoCache,Preprocess,CachedMessages,Mapping,
Roles,ActionForm,Populate,Validate,Forward,Include的处理。
然后创建Action实例,并执行Action返回ActionForward,最后处理
ActionForward。
在处理的过程中,采用责任链模式分别由对应的Command类进行处理,
并随时可能由于异常等原因返回。
7.一次请求到此结束,会根据ActionForward执行下一个流程 或 直接转往JSP生成
HTML发送到浏览器。
4.Struts1.3与Struts 2 的区别:
Struts1.x综述
一、业务逻辑 :应包含在POJO类或EJB中,完全独立于Action。这样做的优点就是不依赖与框架本身,更好复用。 原则:类和类的方法应该有自己独立的职责,能够完成所建领域的特定任务(如ActionForm)
二、处理Exception
原则:1)在异常离开业务层之前捕获,处理,记录业务层抛出的所有异常;
2)在业务层捕获一个异常时,作为一个通用的异常类型重新抛出。
编制定制ExceptionHandler(如加入邮件通知,log记录等功能)
1、扩展org.apache.struts.action.ExceptionHandler,并重写execute方法
2、配置exception时,加入handle选项
三、ActionForm与Action
1、将ActionForm与业务逻辑分离,将ActionForm收集的数据copy到VO对象中,可以借助BeanUtils类完成该项功能。
2、将ActionForm中的公共属性设置为String类型(用户处理数字类型或Date类型,ActionForm默认会做类型转化,如果不能转化会抛出异常,可以用JS在前台处理数据或后台转化,后台转化不成抛出自定义异常信息)
3、将Action作为业务逻辑的调用点,而不是插入点。
4、在ActionForm的reset方法中注意清空checkbox,应为在没有选中checkbox时,HTTP协议发送的数据为空,而页面中原来被选中的不会改变。
四、验证
ActionForm的validate方法
Struts验证框架
JS前台验证
五、扩展Struts
1、扩展RequestProcessor,实现自己的控制器,实际上struts的控制器是RequestProcessor,而不是ActionServlet
a)继承org.apache.struts.action.RequestProcessor
b)重写process,processActionPerform,processPreProcess方法
一般不重写processPreProcess方法,主要是其抛出了ServletException和IOException
c)在配置文件中配置<controller processorClass="**.*Controller"/>
========strut1.x源码分析==========
一、Struts1.x
1、ActionServlet
init方法中初始化ActionMapping,ActionForward
doGet,doPost方法调用ActionServlet.process方法,其间接调用RequestProcessor.process方法
2、RequestProcessor
Process()方法中 processPreProcess 设计上是一个钩子 可以在Action调用之前做一些动作。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
private static Log log = LogFactory.getLog(ActionMapping.class);
processActionCreate Action 是单实例的,因为其存在一个HashMap中
Action instance = (Action) actions.get(className);
if (instance != null) {
if (log.isTraceEnabled()) {
log.trace(" Returning existing Action instance");
}
return (instance);
}
ServletContext.getRequestDispatcher(String url) url为绝对地址
ServletRequest.getRequestDispatcher(String url) url为相对地址
HashMap中keySet方法返回key值集合,values方法返回value集合
http://localhost:8088/news/main/list.jsp news是应用程序的名字
则执行下面向行代码后打印出如下结果:
1、System.out.println(request.getContextPath()); 打印结果:/news
2、System.out.println(request.getServletPath()); 打印结果:/main/list.jsp
3、System.out.println(request.getRequestURI()); 打印结果:/news/main/list.jsp
4、System.out.println(request.getRealPath("/")); 打印结果: F:/Tomcat 6.0/webapps/news/test
struts1.x配置细节:Action中配置ActionForm,实例化ActionForm根据attribute配置
processPopulate中定义了处理ActionForm的定义
ModuleConfigImpl implements ModuleConfig
public ModuleConfigImpl(String prefix) {
super();
this.prefix = prefix;
this.actionConfigs = new HashMap();
this.actionConfigList = new ArrayList();
this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
this.actionMappingClass = "org.apache.struts.action.ActionMapping";
this.actionForwardClass = "org.apache.struts.action.ActionForward";
this.configured = false;
this.controllerConfig = null;
this.dataSources = new HashMap();
this.exceptions = new HashMap();
this.formBeans = new HashMap();
this.forwards = new HashMap();
this.messageResources = new HashMap();
this.plugIns = new ArrayList();
}
2.Action类中最重要的方法: execute().
3.它的验证方式有两种:在服务器端验证(在FormBean里面重写Validate方法),在客户端验证(通过配置文件来进行验证)。
4.在服务器启动时会执行init()来进行初始化一些信息。
5.它的乱码问题可以通过过滤器来解决。
6.struts1所需要用到的jar包可能会和tomcat中的jsp-api.jar,servlet-api.jar包冲突,最好的解决方案是将这两个jar包放到重新建的一个包中去,然后再引用这个包中的jar。
7.在使用validate框架时from类一定要继承ValidatorFrom这个类。
Struts Validator框架采用两个基于XML的配置文件来配置验证规则。
这两个文件为validator-rules.xml和validation.xml。