概述
1,工作流程:
用户发出一个Http请求
经过一系列的过滤器
调用FilterDispather,FilterDispather是控制器的核心,它通过询问ActionMapper来确定该请求是否需要某一个Action
如果需要某个Action,FilterDispather就把请求转交给ActionProxy处理
ActionProxy通过配置管理器Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action
ActionProxy创建一个ActionInvocation实例
一旦Action执行完毕,ActionInvocation实例根据struts.xml文件占到相对应的返回结果
最后,response响应通过web.xml文件配置的过滤器返回
FilterDispather 控制层
Action 模型层
Result 视图层
2,核心文件:
web.xml:
配置会话时间,欢迎页面,错误页面,监听器,过滤器以及一些参数等
struts.properties:
一般存放常量 //键值对
struts.i18n.encoding
struts.devMode
struts.configuration //配置管理器
struts.xml
重要的配置文件
主要用来配置Action和Http请求的对应关系,以及逻辑视图物理视图的对应关系。
示例:
<?xml version="1.0" encoding="utf-8"> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" namespace="/" entends="struts-default"> <action name="" class=""> <result>/YY.jsp </result> </action> </package> </struts>
关键元素分析:
package元素
配置包,在struts2框架中,包是一个独立的单位,通过name属性来唯一标识包
四个属性:
name
extends
namespace //指定命名空间,标识此包下的Action的访问路径
abstract
action元素
name
class //可选 如果没有指定则默认为:com.opensymphony.xwork2.ActionSupport
method //请求调用Action时调用的方法
converter //指定类型转换的类
result元素
当调用Action结束,下一步就是使用result元素来设置给浏览器返回的试图,通常只有name和type两个属性
默认类型是dispater struts2还允许redirect redirect_action
include元素
该元素用来在一个struts.xml配置文件中包含其他的配置文件。
<struts>
<include file="a.xml"/>
<include file="b.xml"/>
</struts>
global-result元素
该元素配置包中的全局结果,如果局部结果没有对应的结果,就会查找全局结果
<package name="p1">
<global-result>
<result name="SUCCESS">/success.jsp</result>
</global-result>
</package>
default-action-ref元素
该元素用来配置默认的Action
Action的动态调用:
对Action中不同方法的调用:
1,通过url: 如为了请求名为demo的Action中的login方法: 请求方式为:/demo!login.action
2, 通过配置struts.xml中的action元素的method属性
通配符:
在struts.xml中通配符主要是指"*","**","()".
通配符“*”匹配0个或者多个字符但是不包括“/”
通配符“**”匹配0个或者多个字符但包括“/”
通配符“” 转义字符
ACTION详解
ActionSupport类
自定义的Action一般直接继承ActionSupport,并自定义变量,覆盖execute()方法,变量的值会通过setter方法自动赋值,execute()方法,变量的值会通过setter方法自动赋值,execute
的返回值配置在struts.xml中的result元素
Action接口
定义了两个常量:error success login input now
以及excute方法
不继承任何类的Action
struts2的Action 并不一定要继承Action接口,任何的POJO都可以作为Action,只需要有public String excute()方法
Action与Servlet API
1,通过ActionContext类来访问Servlet API 主要方法:
void put(String key,Object value)
Object get(String key)
Map getApplication()
static ActionContext getContext() //获得当前线程的ActionContext
Map getSession(): 返回一个Map类型的HttpSession
2,通过特定接口访问
为了在Action中直接访问Servlet API ,可以通过实现下面的几个接口
ServletRequestAware: 实现该接口后,可以直接访问HttpServletRequest实例
ServletResponseAware: 实现该接口后,可以直接访问HttpServletResponse实例
ServletContextAware: 实现该接口后,可以直接访问HttpServletContext实例
3,通过ServletActionContext访问
该类的几个方法:
HttpServletRequest org.apache.struts2.ServletActionContext.getRequest()
HttpServletResponse org.apache.struts2.ServletActionContext.getResponse()
HttpServletContext org.apache.struts2.ServletActionContext.getContext()
ModelDriven接口
对于实现了该接口的Action来说,只需要定义相应的model,struts2就会自动将用户提交的http信息赋值给model
model
class UserModel{
...属性
}
public class LoginAction extends ActionSupport implements ModelDriven<UserModel>{
}
异常处理:
在struts.xml 配置
<struts> <package name="p1"> <global-result> <result name="SQLException">/SQLException.jsp</result> <result name="Exception">/Exception.jsp</result> </global-result> <global-exception-mapping> <exception-mapping exception="java.sql.exception" result="SQLException"> <exception-mapping exception="java.lang.exception" result="Exception"> </global-exception-mapping> </package> </struts>
struts数据检验与国际化
数据校验
1.com.opensymphony.xwork2.Validateable接口
struts2中提供com.opensymphony.xwork2.Validateable接口,这个接口中只存在一个validate()方法,如果有某个类实现了该接口,
Struts2就可以直接调用该类中的validate()方法。
ActionSupport就是实现了该接口的一个类,但是是空实现该方法,所以用户需要重写validate()方法
此方法可以进行服务器端的初步校验,当校验通过后才执行excute()方法,校验出错会将错误添加到ActionSupport中的fieldError
会先执行validateX()再去执行validate()
如果有大量的Action就会特别麻烦
2.通过XWork校验框架实现
字段校验方式
在包下创建 LoginAction-validate.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//Xwork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validator> <field name="age"> //校验年龄 <field-validator type="int"> <param name="min">10</param> <param name="max">40</param> <message>the age must betwen 10 and 40</message> </field-validator> </field> <field name="name"> //校验姓名 <field-validator type="requiredstring"> <message>不能为空</message> </field> </validator>
非字段校验方式
<validator> <validator type="int"> <param name="fieldName">age</param> <param name="min">10</param> <param name="max">40</param> <message>不能为空</message> </validator> <validator type="email"> <param name="fieldName">email</param> <message>不能为空</message> </validator>
3,校验器
1,required校验器
要求指定的字段必须是非空。
<field name="name">
<field-validator type="required">
</field-validator>
</field>
2,requiredstring校验器
字段非空且长度大于1 示例同上
3,int校验器
整数校验器
4,date校验器
<field name="birthday">
<field-validator type="date">
<param name="min">1991-01-01</param>
<param name="max">2017-02-07</param>
<message>
</field-validator>
</field>
5,email校验器
6,stringlength //param name="minLength" "maxLength"
实现国际化
1,包范围资源文件
该资源文件只允许包下的Action访问,存放在包的根路径下
文件名格式:package_language_country.properties
如中文:package_zh_CN.properties
package_en_US.properties
2,类范围资源文件
ActionName_language_country.properties
3,全局范围资源文件
src路径下
命名格式:name.properties
全局资源文件加载不是自动的,必须在struts2配置文件中指定
在struts.xml配置如下:
<constant name="struts.custom.il18.resources" value="peopertiesName"/>
也可以在struts.properties 指定:
struts.custom.il18.resources=propertiesName
4,临时资源
mess_en_US.properties
访问国际化资源:
1,通过ActionSupport中的getText()方法,该方法中的name参数对应国际资源文件的key值,返回value值
2,在jsp页面使用struts2的<s:text>标签
3,在jsp页面的表单元素中可以指定一个key
资源文件的加载顺序:
在action/jsp中的顺序: 类范围->父类范围->接口范围->包->全局->直接输出
Struts标签库
标签分类:
1,普通标签
1,控制标签
用来实现分支,循环等流程控制
if/ifelse/else/append/generator/iterator/merge/sort/subset
2,数据标签
用来输出后台的数据和完成其他数据访问的功能
a/action/bean/date/debug/il8n/include/param/property/push/set/text/util
2,UI标签
1,表单标签
主要用来生成HTML中的表单元素
checkbox/checkboxlist/combobox/doubleselect/head/file/form/hidden/label/radio/reset/select/submit/textarea
2,非表单标签
主要生成div标签,及输出action封装的信息
comonent/div
3,Ajax标签
提供ajax支持
标签的使用:
1,引入标签库:
在jsp中使用taglib标签引入
<%@ taglib prefix="s" uri="/struts-tags">
2,OGNL(object graph navigation language)
3,解析控制标签
1,if/ifelse/else
<s:if text="表达式">
</s:if>
<s:elseif text="表达式1">
</s:elseif>
<s:else>
</s:else>
2,append 集合拼接成新的集合
<s:append var="newlist"> //合并集合
<s:param value="{"1","2","3"}"/>
<s:param value="{"4","5","6"}"/>
</s:append>
<s:iterator value="%{#newlist}" id="lst"> //迭代输出
<s:property value="lst"/>
</s:iterator>
3,generator 将指定字符串按指定分隔符分割成多个字串
4,iterator
5,merge 将多个集合拼接成一个集合 集合元素交叉拼接
6,sort 指定集合元素排序
7,subset 去除指定集合的子集
4,解析数据标签
1,a标签,构造超链接
2,action标签,在jsp页面调用action
3,bean标签 用于创建一个JavaBean实例
4,date标签 用于输出指定格式的日期 属性:name var nice(时差 boolean) format
5,debug标签 调试工作
6,il8n标签 资源绑定
7,include标签
8,param标签
9,property标签
10,push标签
11,set标签 将某值放入某个范围
12,text标签 国际化资源信息
13,url标签 生成url映射地址
5,解析struts表单标签
1,form标签 产生对应的html<form>
2,submit标签 产生html提交按钮
3,checkbox 复选框
4,checkboxlist 一次创建多个复选框
5,combobox 创建文本框和下拉列表框
6,doubleselect 创建两个相关联的列表框
7,head
8,file 文件选择框
9,hidden 隐藏表单元素
10,inputtransfersselect 获取输入转到列表框中
11,label
12,optiontransferselect 选项转移列表组件
13,select 下拉列表框
14,optgroup 下拉列表框的选项组
15,password
16,radio 多个单选框
17,reset 重置按钮
18,textarea/textfield 文本域
19,token 防止表单重复提交
20,updownselect
6,解析非表单标签
actionerror 输出错误信息到客户端
actionmessage 输出提示信息到客户端
component 使用自定义标签,模板,主题
div
fielderror
Struts之拦截器 //Interceptor
拦截器概述
位于ActionProxy与Action之间
使用拦截器
1,配置拦截器
在struts.xml
<interceptor name="interceptorName" class="interceptorClass">
2,拦截器栈
在struts.xml
<interceptors>
<interceptor name="interceptorName1" class="interceptorClass"/>
<interceptor name="interceptorName2" class="interceptorClass"/>
<interceptor-stack name="mystack">
<interceptor-ref name="interceptorName1"/>
<interceptor-ref name="interceptorName2"/>
</interceptor-stack>
</interceptor>
3,默认拦截器
默认拦截器对包下所有的action都起作用
在struts.xml
<interceptors>
<interceptor name="interceptorName1" class="interceptorClass"/>
<interceptor name="interceptorName2" class="interceptorClass"/>
<interceptor-stack name="mystack">
<interceptor-ref name="interceptorName1"/>
<interceptor-ref name="interceptorName2"/>
</interceptor-stack>
<default-interceptor-ref name="mystack"> //默认拦截器栈
</interceptor>
4,使用拦截器
在struts.xml中
<package name="default">
<interceptors>
<interceptor name="interceptorName1" class="interceptorClass"/>
<interceptor name="interceptorName2" class="interceptorClass"/>
<interceptor-stack name="mystack">
<interceptor-ref name="interceptorName1"/>
<interceptor-ref name="interceptorName2"/>
</interceptor-stack>
<default-interceptor-ref name="mystack"> //默认拦截器栈
</interceptor>
<action name="loginaction" class="cn.xom.loginaction">
<result name="success">/success.jsp</result>
<interceptor-ref name="interceptorName1"/> //使用拦截器1
<interceptor-ref name="mystack"/> //使用拦截器栈
</action>
</package>
Struts2的内置拦截器
alias拦截器
该拦截器的作用是给参数起一个别名,当Action链中需要用到同一个HTTP请求的参数值时,该拦截器可以让这些Action的不同属性名共享同一个参数值
page:267
prepare拦截器
该拦截器用来调用实现了preparable接口的Action中的prepare()方法
在执行excute()方法之前执行prepare()方法
timer拦截器
输出电泳action所需的时间
自定义的拦截器
开发自定义的拦截器
1,实现com.opensymphony.xwork2.interceptor接口
void init();
void destory();
String intercept(ActionInvocation invocation) throws Exception
2,继承抽象拦截器类AbstractIntercrptor //实现了上述接口,提供init/destory方法的空实现
拦截器的执行顺序:
第一个拦截器->第二个拦截器->action1->action2->第二个拦截器->第一个拦截器
方法过滤拦截器
继承MethodFilterInterceptor抽象类,实现doIntercept()方法
MethodFilterInterceptor还提供了两个方法:
Struts中使用Ajax
ajax是一种web客户端技术,结合了JavaScript,CSS,Html,XMLRequest,dom等技术。异步方式与服务器进行通信
XMLHttpRequest
属性:readystate / status / responseXML /responseText
方法: abort() 暂停请求
send() 将请求发送到服务器
open() 访问
LoginAction: name password excute{ HttpServletResponse resp=ServletActionContext.getResponse(); resp.setContentType("text/html,charset=utf-8"); resp.setCharacterEncoding("utf-8"); PrintWrite pw=resp.getWrite(); pw.println("welcome login"); if(name.equals("admin")&&password.equals("admin")){ pw.println("success"); }else pw.println("error"); return "success"; } index.jsp <script type="text/javascript"> var XHR=false; funtion CreateXHR(){ try{ XHR=new ActiveXObject("msxml2.XMLHTTP"); }catch(e1){ try{ XHR=new ActiveXObject("microsoft.XMLHTTP"); }catch(e2){ try{ XHR=new XMLHttpRequest(); }catch(e3){ XHR=false; } } } } funtion sendRequest(){ CreateXHR(); if(XHR){ var name=document.getElementById("name").value; var password=document.getElementById("password").value; var url="http://localhost:8080/AjaxDemo/login.action?name="+name+"&password="+password; XHR.open("Get",url,true); XHR.onreadystatechange=resultHeader(); XHR.send(null); } } funtion resultHeader(){ if(XHR.readyState==4&&XHR.status==200){ alert(XHR.responseText); } }
Ajax标签
Ajax标签依赖包
<%@ taglib prefix="aj" usrl="/struts-dojo-tags">
Ajax标签的共有属性
href 指定访问的URL
listenTopics
notifyTopics
1,<a>标签
当点击时会做一个异步访问。 属性: targets 逗号分隔的html元素id列表,这些元素的内容将会被更新
handler 制定处理请求的javascript函数
formid 指定表单id,表单的字段将被序列化作为参数传递
<div id="div1">div1</div>
<s:url id="ajaxTest" value="/login.action"/>
<sx:a id="link1" href="%{ajaxTest}" targets="div1">Update content</sx:a>
2,<div>标签
该标签的内容可以通过ajax异步请求来获取到,可以实现页面的局部内容更新
属性:
handler
formid
errorText
loadingText
autoStart
<s:url id="ajaxTest" value="/login.action"/>
<sx:div href="%{ajaxTest}"
errorText="There was an error"
loadingText="reloading..."
updateFreq="5000" //重新加载的频率
/>
3,<submit>标签
异步提交表单
4,<datetimepicker>
Ajax之Json插件
<package name="jsonManager" extends="json-default">
<action name="userJson" class="com.action.UseJson">
<result type="json"></result>
</action>
</package>
funtion resultHeader(){
if(XHR.readyState==4&&XHR.status==200){
var userobj=JSON.parse(XHR.responseText);
alert("the username is"+userobj.User.name);
}
}
文件控制上传和下载
文件上传:
<s:form action="file" enctype="multipart/form-data" method="post">
<s:file name="uploadfile" label="选择文件"/>
<s:submit />
</s:form>
转载于:https://www.cnblogs.com/dengyuanqi/p/6378406.html
最后
以上就是俊逸航空为你收集整理的Struts2学习的全部内容,希望文章能够帮你解决Struts2学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复