struts知识收集

Struts
基本概念:
1.什么是MVC?有什么用?
2.控制器的结构
3.什么是Struts?有什么用?
4Struts的内容与环境配置
 
什么是MVC?有什么用?
MVC是一种设计框架,程序流程清晰,便于维护
表现层                     中间层                     持久层
(web)                      (业务层service)          (data)
CV                       M                       
 
我们重点看一下web层:
用户请求---C:做两件事情,第一,得到url(v1),第二,查看url对应得动作action---action
Action访问中间层M层得到结果,查看这个结果对应得url(v2)---C---v2
 
Jsp---javabena模式的缺点在于流程非常复杂,所以mvc解决了这个问题,所有的流程在C,中心控制器,但是,如果我们需要再添加或修改一些动作的话,还是要修改C中心控制器的,这样不大方便,那么Struts框架解决了这个问题
 
控制器的结构:
C(中心控制器)也叫前端控制器:所有的请求和返回都要通过它
C后面是多个action,它帮助CM进行交流的
 
什么是Struts?有什么用?
MVC的实现,实现了C中心控制器,我们看一下Struts框架的MVC
V1---C(ActionServlet)---xml(struts_config.xml):通过这个文件得到url(v1)对应的action---action---xml通过这个文件得到和结果对应的url(v2)---action---C---v2
这样,所有的流程在这个xml文件中,那么要添加或者修改action的时候,我们不需要修改C,这个Cservlet类,只要修改Strust_config.xml就可以了
Struts的工作流程:
web应用启动,便会加载ActionServlet类,这个类常驻内存的,当用户发送请求的时候,ActionServlet读取Struts_config.xml,将得到的信息保存到相应的对象中,例如,将url对应的action保存到ActionMapping对象中
 
ActionServlet的工作流程:
当接到请求后,调用process()方法,将请求交给RequestProcessor的实例来处理,在struts1.1后,请求的处理者变成了RequestProcessor
 
RequestProcessor的工作流程:
1.什么是RequestProcessor?有什么用?
这个类接收来自servlet的每一个请求,我们可以自己定制请求的处理功能,需要继承这个类,并且在struts_config.xml中改写<controller>标签
2.工作流程:
processMutipart():在这个方法中,Struts将会读取request来检查requestcontentType是否是multipart/form-data。如果是的话,将会解析request并且将之包装到HttpServletRequest中。当你创建了一个HTML FORM用来提交数据,那么requestcontentType默认就是application/x-www-form-urlencoded。但是如果你的form使用了file类型的input控件允许用户上传文件的话,你就必须将contentType改为multipart/form-data。如果是这样的情况,你就不能再通过getParameter()来获取用户提交的数据;你必须将request作为一个InputStream来读取,并且自己解析它来获得参数值
 
processPath():String path = processPath(request, response);得到url
 
processLocale():确定客户端的位置,做国际化的,再一个调用这个方法会创建一个HttpSession,如果不想被创建,可以在struts_config.xml中设置不调用这个方法,<controller>
 <set-property property="locale" value="false"/>
</controller>
 
processContent():通过调用response.setContentType()来为response设置contentType。这个方法首先会尝试从struts-config.xml配置中得到contentType。缺省情况下使用text/html。如果想覆盖它,可以象如下这样:
<controller>
 <set-property property="contentType" value="text/plain"/>
</controller>
 
processNoCache():可以解决输出的时候出现缓存response的问题
如果配置是no-cacheStruts将会为每个response设置下面三个headers
requested in struts config.xml
response.setHeader("Pragma", "No-cache";
response.setHeader("Cache-Control", "no-cache";
response.setDateHeader("Expires", 1);
如果你想设置no-cache header,在struts-config.xml中加入下面信息:
<controller>
 <set-property property="noCache" value="true"/>
</controller>
 
processPreprocess():回调方法,里面的内容为return true;返回为true,控制器继续执行,否则停止,我们可以重写这个方法来控制中心控制器是否继续执行(这个方法为预处理提供一个hook(钩子),可以在子类中覆盖它。它的缺省实现没有作任何事情,总是返回true。返回false的话将会终止当前请求的处理)
 
processMapping():   
ActionMapping mapping = processMapping(request, response, path);
    if(mapping == null) {
        return;
    }
通过url得到ActionMapping对象,这个对象存放的是url-action,rst-url映射的信息
这个方法将会用路径信息得到一个ActionMapping对象。也就是struts-config.xml文件中的<action>元素:
<action path="/newcontact" type="com.sample.NewContactAction"
        name="newContactForm" scope="request">
 <forward name="sucess" path="/sucessPage.do"/>
 <forward name="failure" path="/failurePage.do"/>
</action>
ActionMapping元素包含了Action类的名称和处理请求使用的ActionForm等等信息。它还包含当前ActionMapping配置的ActionForwards信息
 
processRoles():struts的安全机制
Struts web应用提供了一个授权方案。也就是说,一旦一个用户登入了容器,strutsprocessRoles()方法将会通过调用request.isUserInRole(),来检查他是否有必须的角色来运行一个给定的ActionMapping
<action path="/addUser" roles="administrator"/>
假设你有一个AddUserAction并且你只想让administrator能够增加新的user。你所要做的就是给你的AddUserAction元素增加一个role属性,这个属性的值为administrator。这样,在运行AddUserAction之前,这个方法会确保用户拥有administraotr的角色
 
processActionForm():ActionForm就是一个javabean,这个类是用来存储并处理表单数据的,首先会去request scope中找这个对象,如果没有,创建一个,有得话就从里面拿出来直接用,每一个ActionMapping都一个相应的ActionForm类。当Struts处理一个ActionMapping的时候,它将会从<action>元素的name属性中找出对应的ActionForm类的名称。
<form-bean name="newContactForm"
           type="org.apache.struts.action.DynaActionForm">
 <form-property name="firstName"
                          type="java.lang.String"/>
 <form-property name="lastName"
                          type="java.lang.String"/>
</form-bean>
 
processPopulate():这个方法就是将表单的参数封装到ActionForm对象
 
processValidate():表单验证Struts将会调用你的ActionForm类的validate方法。如果你从validate()返回ActionErrors,它将会将user重定向到<action>元素的input属性指定的页面
 
processForward():检查mapping中有没有使用流转标签,找到后使用,功能相当于RequestDispatcher.forward(),流转到指定的url
 
processInclude():检查mapping中有没有使用包含标签,找到后使用,功能相当于RequestDispatcher.include(),将一个指定的url包含
如果上面两个方法都设置了,只会调用forward()
 
processActionCreate():这个方法从<action>标签中的type里得到action类,创建这个类的实例
 
processActionPerform():这个方法调用actionexecute()方法,execute()这个方法一般写业务逻辑的,我们在写action的时候,会继承action类,实现execute()这个方法
 
processForwardConfig():通过上面的步骤,requestProcessor为我们创建了一个ActionForward的实例,也就是execute的返回值,在这个对象中有nextUrl,也就是action得到的rst对应的path,这个path就是nextUrl,然后创建这个urlRequestDispathcher对象,再调用这个对象的RequestDispathcher.forward()方法

 

表单验证:
1.ActionForm validate()
2.ActionErrors
3.ActionMessage
4.资源文件
5.引例
 
ActionForm validate():
要想做服务器端的表单验证,可以使用ActionFormvalidate方法,在这个方法中定义验证逻辑
这个方法将返回ActionErrors类型的对象
 
ActionErrors:
这个类型的对象里面封装了若干的ActionMessage对象
 
ActionMessage:
这个里面有指向资源文件的key
 
资源文件:
classes/:MessageResources.properties
作用:这个资源文件里面有key指向的一些字符串,我们如果需要在页面上显示一些字符串信息,就可以使用
这个资源文件来实现,好处就是维护方便,可以国际化
struts-config.xml中可以定义资源文件:
<message-resources>
 
ActionForm里面是ActionMessage,ActionMessage里面是key,key指向一个资源文件
 
国际化:
1.什么是国际化?有什么用?
2.开发步骤
3.引例
 
什么是国际化?有什么用?
界面友好化,比如说,中国区域的打开网站,显示中文,美国区打开网站显示的是英文
 
开发步骤:
1.写个文本文件,在里面写key-value
2.使用工具转化,并改副名
3.重启应用程序
struts exception:
1.什么是struts exception:有什么用?
2.内容
3.引例
 
什么是struts error?有什么用?
struts异常是处理action发生的异常,使用的是资源文件输出异常信息
 
内容:
action两种情况产生的异常:
1.action还没有将数据传递到m层的时候就产生的异常
2.收到m层的结果后产生了异常,例如:数据库连接不正常,返回的结果不对等等
 
处理流程:
1.捕获异常
2.抛出异常,requestproessor接到这个异常
3.转给默认的异常处理器(也可以自己定义一个异常处理的类)
4.将处理的信息显示在一个jsp页面上
动态form:
1.什么是动态form?有什么用?
2.语法
3.引例
 
什么是动态form?有什么用?
懒汉form,不用写ActionForm类了,直接在配置文件中声明,这样的好处在于如果表单的数量变更就不用再修改ActionForm类了,struts会根据配置文件自动生成代码,但是没有表单验证的功能了
 
语法:
修改struts-config.xml:
     <form-bean
            name="dyLoginForm"
            type="org.apache.struts.action.DynaActionForm">
         <form-property name="user" type="java.lang.String" />
         <form-property name="pwd" type="java.lang.String" />
     </form-bean>
DynaActionForm这个类是动态form类,声明表单的属性
action类这样写:
DynaActionForm df=(DynaActionForm)arg1;
df.get("参数");
DispatchAction:
1.DispatchAction是什么?有什么用?
2.工作流程
3.语法
4.引例
 
DispatchAction是什么?有什么用?
看一个问题,一个表单可能有多处用途,比如说增加,修改,如果我们根据这个需求写程序
需要写两个action,因为Action类的方法比较单一(execute()),一个功能就对应一个
action,分的太细,如果是一个用例的,做一个表单,一系列操作这个表单的action,这种情况我们希望只写一个action,去完成同一用例,一个表单所对应的一系列功能
DispatchAction可以完成这个任务
 
工作流程:
请求(表单参数and参数值)--C控制器(requestProessor)--xml(得到配置信息,其中读取url对应的parameter,parameter里面指定了表单参数,找到了参数就找到了该参数的值)--action(requestProessor执行execute()方法,根据参数值,调用和参数值名字一样的方法)
 
语法:
1.jsp中要在表单url后面添加参数和参数值
url?canshu='value'
2.在配置文件中的action中添加<parameter=参数>
LookDispatchAction:
1.什么是LookDispatchAction?有什么用?
2.工作流程
4.引例
 
什么是LookDispatchAction?有什么用?
通过这个Action抽象类继承DispatchAction,它的相应方法的执行由 ActionMappingparameter属性决定。它适合在一个form中有很多按钮,按不同的按钮则执行不同的操作
 
工作流程:
原理:
这个类利用了资源文件
提交按钮<-->key<-->方法名:LookDispatchActiongetKeyMethodMap()key<-->方法名做关联,利用的是map,在jsp页面中提交按钮参数与key做关联,然后在配置文件中的action<parameter=提交按钮参数>
MappingDispatchAction:
1.什么是MappingDispatchAction?有什么用?
2.工作流程
3.引例
 
什么是MappingDispatchAction?有什么用?
使用这个aciton,对程序员来讲更有亲和力,一个url对应一个MappingDispatchAction类的一个方法,这样程序员读程序更加清楚,实现的功能都是一样的
 
工作流程:
请求--C:得到请求中的url--读配置文件:得到url对应的action,找到parameter参数中的方法名,调用vaildate方法,这个方法根据url对应的parameter的方法名,去掉action类中的同名方法
 
语法:
jsp:url
struts-config.xml:url对应action(paramter="action类的方法名")
action:得到了paramter中的值,调用和这个值名字相同的方法
validator Framework:
1.什么是validator?有什么用?
2.工作原理
3.需要的资源
4.struts中配置validator插件
5.validator-rules.xml:
6.validator.xml
7.针对formbean作验证:静态formbean and 动态formbean
8.针对formbean存在的问题
9.针对action做验证:静态,动态
10.针对formbean的客户端验证
11.针对action的客户端验证
 
什么是validator?有什么用?
表单验证框架,看两个问题,我们以前使用的验证是在ActionForm的子类中重写validate方法,在这里面写验证逻辑代码,这样会产生两个问题,一是当验证逻辑改变的时候,需要修改ActionForm,二是因为一个应用中可能有多个表单,每个表单的验证逻辑都不一定一样,这样需要再写多个ActionForm,造成代码冗余,如果要修改验证逻辑,维护起来也是很麻烦的,但是使用表单验证框架可以解决这些问题
 
工作原理:
请求--C控制器:控制器读Struts-config.xml文件,安装validator框架,查看配置文件中url对应的action中需不需要验证,如果需要,读取validator.xml文件,找到form,调用验证类的验证方法来验证form,这些方法在validator-rules.xml中定义
 
需要的资源:
1.两个jar,jakarta-oro.jar:处理文本的类 commons-valdator.jar:包含验证类
这两个包struts自带
2.配置文件:validator-rules.xml and validator.xml WEB-INF:目录下
 
struts中配置validator插件:
struts-config.xml:
 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property
        property="pathnames"
        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>
<plug-in>:定义插件的标签
className:插件的类
value:配置文件
自动配好的,一般情况下不需要改动
 
validator-rules.xml:
1.有什么用?
在这里定义validator的表单验证规则:如,不能为空验证等
2.语法:
<form-validation>根标签
   <global>全局标签
validator.xml:
1.这个文件是什么?有什么用?
如果我们想给以个表单加上验证的话,需要在这里为表单添加验证规则
也就是说,要说明哪个form的哪些属性,要做什么功能的验证
2.语法
<formset>:form集合标签,这里面的都是定义表单需要验证的功能
<form>name:需要验证的formbean,但是如果是针对action的验证,这个写的是action对应的path,如:/login
<field>:表示表单中控件的验证规则
<field property>:需要验证的表单中的控件
<field depends>:验证规则名,这个验证规则是在validator-rules.xml定义的
<msg>:替换了validator-rules.xml中的msg,name属性:验证规则 key:资源文件中的key,这个验证规则如果验证
失败的话,那么显示这个key指向的value
<arg>:在资源文件中key and value可以带上参数,这个参数由程序员在配置validator.xml文件中设置
<arg name>:验证规则,意思是为哪个验证规则做字符串传递
<arg resource>:如果为false,那么传递的这个值直接为字面量
<var>:arg的参数传递变量
        <form name="logonForm">
            <field
                property="username"
                depends="required">
                    <arg key="logonForm.username"/>
            </field>
            <field
                property="password"
                depends="required">
                    <arg0 key="logonForm.password"/>
             <arg1 name="required" key="${var:mask}" resource="ture|false">
                    <var>
                        <var-name>mask</var-name>
                        <var-value>^[0-9a-zA-Z]*$</var-value>
                    </var>
            </field>
        </form>
 
针对formbean作验证:静态formbean and 动态formbean:
1.开发步骤:
A.配置formbean:静态的继承ValidatorForm类,动态的在配置文件中配置
B.在配置文件中设置validate="true" input="url"
C.validator.xml:为需要验证的formbean设置验证规则
D.配置资源文件
针对formbean作验证所存在的问题:
一个表单对应多个操作,比如,增加,删除等,这样他们所需要的验证规则也不一样
如果我们沿用一个表单一个action一个formbean的原则,那么我们用针对formbean的表单验证方式,就无法实现这样的需求,因为
在设置表单验证规则的时候,我们对应的是一个formbean,使用针对action的方式作验证可以解决这个问题
 
针对action做验证:静态,动态
 
1.什么叫针对action做验证?有什么用?
为一个表单对应的多个action设置不同的验证规则,因为一个表单可能在不同的情况下需要不同的验证规则
2.开发步骤
A.配置formbean:静态的继承ValidatorActionForm类,动态的在配置文件中配置org.apache.struts.validator.DynaValidatorActionForm
B.在配置文件中设置validate="true" input="url"
C.validator.xml:为需要验证的formbean设置验证规则<form name="actionpath">
D.配置资源文件
 
针对formbean的客户端验证:
1.客户端和服务器端表单验证的区别
服务器端真正保证安全,客户端减少服务器端的一些复杂度
2.语法:
利用struts标签,jsp页面上写验证程序,也可以直接使用javascript
<html:form method="post" action="url" οnsubmit="return validate(formbean的名字)(this);">
"return validate(formbean的名字)(this);"这句话将调用javascript代码
<html:javascript forname="formbean的名字">生成javascript代码
 
针对formbean的客户端验证:
语法:
<html:form method="post" action="url" οnsubmit="return validate(formbean的名字)(this);">
"return validate(formbean的名字)(this);"这句话将调用javascript代码
<html:javascript forname="action对应的path">生成javascript代码
 
 
 
Tiles framework:
1.什么是Tiles framework?有什么用?
2.内容
3.引例
 
 
什么是Tiles framework?有什么用?
jsp模版,好处就是可以降低代码的复杂度,可以重用
 
内容:
layout,类库,配置文件xml,正式定义的组件(在配置文件中定义),非正式定义的组件(jsp页面)
 
配置Tiles插件:
struts-config.xml中配置<plogin>
 
layout:
什么是layout?这个文件中定义的是组件的位置,本身也是个jsp页面
 
<tiles:insert>:
类似于include,但是他可以使得布局与组件分离,布局可以重用
A:include B,AB的内容加进来
A:<tiles:insert>B,C,D.... A这个页面,使用这个语法,将B,C,D这些页面插入到布局页面指定的位置上,最终形成成品A页面,A就是成品,布局页面就是模子,B,C,D等页面就是组件
definitions:
 
definitions是什么意思?有什么用?
网站有些网页可能只有body部分需要改动,如果用以前的方式做的话,代码会产生冗余,使用definitions可以加少代码的冗余有个特性,definitionstiles-defs.xml定义,有名字,所以可以继承,并且可以重写其中的组件
 
开发步骤:
1.tiles-defs.xml中定义definitions
<definition name="def" path="/pages/tiles/layout/layout.jsp">
 <put name="title" value="Page Title" />
 <put name="head" value="/pages/tiles/head.jsp" />
 <put name="footer" value="/pages/tiles/footer.jsp" />
 <put name="menu"   value="/pages/tiles/menu.jsp" />
 <put name="body"   value="/pages/tiles/body.jsp" />
</definition>
2.jsp页面
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib prefix="tiles" uri="/tags/struts-tiles" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<tiles:insert definition="def" flush="true">
     <tiles:put name="body" value="/pages/tiles/body1.jsp"/>
</tiles:insert>
</body>
</html>
 
body1.jsp:
<h1>body1 body1</h1>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页