在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象,例如:Action的映射信息存放在ActionMapping对象中.
当ActionServlet接收到一个客户请求时,将执行如下流程.
可以更改,在web.xml中把
action
*.do
中的url-pattern值改成你想要的后缀名就可以了。
在action中只要继承了org.apache.struts.actions.Action及子类,即可通过getDataSource方法获得数据源,代码如下:
//多个数据源
DataSource datasource = this.getDataSource(httpServletRequest, ”key值”);
//单个数据源
DataSource datasource = this.getDataSource(httpServletRequest);
name:用来表示Actionform的名称,
attribute:表示ActionFrom的实例放到作用域中的名称.
不是线程安全的。
在Struts的生命周期中,只会为每个Action类创建一个实例,所有的客户请求共享这个实例。因此,必须保证在多线程环境中,Action也能正常工作。因此在Action类中要谨慎使用实例变量。
如果在Action类中定义了实例变量,那么在Action实例的整个生命周期中,这个实例变量被所有请求的线程共享。因此不能在Action类,特别是execute方法中定义代表特定客户状态的实例变量。如果要采用实例变量,需要采用Java的线程同步机制。
一共有4个参数
ActionMapping mapping 获取映射
ActionForm form 获取表单
HttpServletRequest request 获得请求
HttpServletResponse response 获得响应
Action的Execute方法的返回值的类型是ActionForward,返回此类型的方法有三种:1、通过new一个ActionForward,传入它要去的页面的路径;
2、通过mapping.findForward()的方法,通过action配置中的forward属性来找到相应跳转的页面;
3、通过mapping.getInputForward()的方法,根据action配置中的input属性来查找。
ActionForm中的错误消息是通过ActionForm中的validate方法来进行验证的,validate()方法会传回ActionErrors对象,ActionErrors可以储存ActionError的讯息,这时ActionServlet就不会继续进行接下来的工作,而是导回structs-config.xml所设定的位置,并forward至input属性所设定的位置。
页面上是通过struts提供的标签来显示出错消息的。
Action对于消息的存取是通过ActionMessages来实现的,ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List中.也就是说key标识了一组ActionMessage.
页面上是通过struts的的标签来显示的。
1. 动态的ActionForm,由actionform继承而来,之所以有这个东西是因为,它特点是不需要FormBean,而是在struts-config.xml中通过form-property来设置form的表单字段属性.优势是减少在大型开发过程中formbean的增加而显得程序臃肿,给维护和升级带来极大的不便.
2.需要注意的是: 在JSP或Action中访问动态ActionForm时与标准的ActionFrom有所不同,标准ActionForm为每个属性均提供了一对getXXX()/setXXX()方法,通过调用getxxx()/setxxx()方法即可读取或设置ActionForm某个属性.而DynaActionForm则把所有的属性保存在一个Map类对象中,只能通过get()和put()来存取其属性值.
如,从动态表单实例中读取会员的注册信息:
String username=form.get(“username”).toString();
String password=form.get(“password’).toString();
String phone=form.get(“phone”).toString();
在动态的ActionForm中,要设置一个日期类型的属性,有两种方式:
1.直接将数据类型设置为java.sql.Date,但是在页面上必须输入yyyy-mm-dd格式的日期才能行。
2.将类型设置为java.lang.String,不过后台需要转换。
动态ActionForm是通过在配置文件中设置相应的表单控件的名称的属性来实现表单控件值的存取。
取得动态ActionForm的控件的值的方法有两种,一是通过request.getParameter()的方法来获得,二是使用动态的ActionForm来获取值,只要调用相应的动态ActionForm的get()方法,如:testDynamicActionForm.get(“控件名称”)。
普通Action通常只能完成一种业务操作.
DispatchAction可以处理多个业务请求, 只不过再配置Action的时候需要设置parameter=”your_method”;
请求时这样写http://localhost:8080/test.do your_method=add&id=1
其中add是继承DispatchAction的Action类的一个业务操作。
1) HTML Tags:该标签库包含的标签可以用来创建Struts输入表单。
2) Bean Tags:该标签库包含的标签可以用来创建bean、访问bean和访问bean的属性。同时提供了依据cookies、headers和parameters的值创建相关bean的能力。
3) Logic Tags:该标签库包含的标签可以用来进行逻辑判断、集合迭代和流程控制。
当标签与JavaBean合作的时候,Name代表作用域中Bean的名称;当标签没有跟JavaBean合作,Name表示作用域中对象的名称。因为在配置文件中已经通过name这个属性将action和actionForm关联在一起了,所以可以不用写。
当标签与JavaBean合作的时候,Name代表作用域中Bean的名称; Property
Bean中属性的值。
在标签体系中,最高的是JspTag,它是一个接口,内部没有任何的东西;接着是Tag和SimpleTag,他们都是接口,SimpleTag是简单的标签类,只能实现无body的标签,它的实现类是SimpleTagSupport。
Tag下面的接口是IterationTag;它的子接口是BodyTag;IterationTag的实现类有TagSupport,主要用来做无body的标签,BodyTagSupport继承自TagSupport并实现了BodyTag接口,主要实现有body标签。
1、创建实现了Tag接口的标签处理程序类,创建相应的属性。
2、创建一个TLD描述文件来描述这个标签,在TLD文件中定义与标签处理程序Java类中定义的属性对应的属性。
3、在jsp页面中导入标签。
4、在jsp页面使用自定义标签。
1、获取ServletContext对象:
this.pageContext.getServletContext();
2、获取HttpSession对象:
this.pageContext.getSession()
3、获取HttpServletRequest对象:
ServletRequest servletRequest = this.pageContext.getRequest();
HttpServletRequest request = (HttpServletRequest) servletRequest;
doTag()方法,它没有返回值
1、资源文件的编写
2、Jsp页面必须使用UTF-8编码机制
3、使用来输出资源文件中定义的资源显示信息。
4、本地页面语言的指定。
在对应的ActionForm中设置相应属性的初始值,或者调用ActionForm中的相应属性的set方法来为其设置初始值。
无法通用,
1. ActionForm是表示表单对象,负责action和表单的数据传递,javabean是表示和数据库交互的对象。
2.从软件分层角度看,bean分开的话,一旦框架发生变化,无需进行大量代码重构。
1、先把自动提交设置成false;
2、先插入一个空的大对象empty_clob();
3、将这条记录锁住;
4、取出这条记录中的CLOB或BLOB的内容,用流的方式写入到数据库中,再关闭流;
5、提交。