The content of element type "package" must match "(result-types?,interceptors?,d

本文通过一个具体的例子详细解析了Struts2框架中配置文件struts.xml的正确配置方式,特别是关于package元素内部子元素的正确顺序,这对解决运行时出现的配置错误具有指导意义。

在编写后台登陆模块时,将许多默认的设置放在一个名为default的package
里。然后再定义其他package继承该包。之前我的struts.xml配置如下
<struts>
    <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
    <constant name="struts.devMode" value="true" />
   
    <package name="exam_default" extends="struts-default" namespace="/">
        <!--自定义拦截器及拦截器栈-->
        <interceptors>
            <!--用户认证拦截器-->
            <interceptor name="authentication" class="action.admin.AuthenticationInterceptor"/>
             <!--用户认证拦截器栈,用于防止用户非法访问-->
            <interceptor-stack name="user" >
                <interceptor-ref name="authentication" />
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
            <interceptor-stack name="guest" >
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <!--全局异常映射-->
        <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.Exception"/>
        </global-exception-mappings>
       <!--全局result-->
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
    </package>
   
    <package name="admin" extends="exam_default" namespace="/admin">
        <action name="login" class="login">
            <result type="redirectAction">index</result>
        </action>
        <action name="index">
            <result>index.jsp</result>
        </action>
    </package>
</struts>
      各位,谁看出来这哪里错了吗??反正最开始我是没看出来。一运行程
序来个错误。
“The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?,default-class-ref?,global-results?,global-exception-mappings?,action*)". ”
刚看到这个错误我就想,哪个也没写错呀。仔细对了好几遍也没发现哪个属
性写错了。最后Google了一下,看了别人写的文章豁然开朗了。

     这个错误的意思是,package里元素必须按照一定的顺序排列。这个顺序
就是
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(就是所有的action放到最后)

当使用`axios.put`请求强制移除`Content-Type`后仍出现`content-type: application/x-www-form-urlencoded`,可以通过以下几种方式解决: #### 1. 使用`transformRequest` 在请求配置中使用`transformRequest`来确保`Content-Type`被移除: ```javascript axios.put(tourl, file, { timeout: 600000, headers: { 'Content-Disposition': `attachment; filename="${this.form.name+'.'+file.name.split(".").pop()}"` }, transformRequest: [function (data, headers) { delete headers['Content-Type']; return data; }], onUploadProgress: (progressEvent) => { const percent = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); console.log(`已上传: ${percent}%`); onProgress({ percent }); } }) ``` #### 2. 检查数据类型 如果数据是`FormData`类型,`axios`通常不会自动添加`Content-Type`头,浏览器会根据数据自动设置合适的`Content-Type`。可以将数据包装成`FormData`: ```javascript const formData = new FormData(); formData.append('file', file); axios.put(tourl, formData, { timeout: 600000, headers: { 'Content-Disposition': `attachment; filename="${this.form.name+'.'+file.name.split(".").pop()}"` }, transformRequest: [function (data, headers) { delete headers['Content-Type']; return data; }], onUploadProgress: (progressEvent) => { const percent = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); console.log(`已上传: ${percent}%`); onProgress({ percent }); } }) ``` #### 3. 全局配置 在全局`axios`配置中移除`Content-Type`: ```javascript axios.interceptors.request.use(config => { if (config.method === 'put') { delete config.headers['Content-Type']; } return config; }); axios.put(tourl, file, { timeout: 600000, headers: { 'Content-Disposition': `attachment; filename="${this.form.name+'.'+file.name.split(".").pop()}"` }, onUploadProgress: (progressEvent) => { const percent = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); console.log(`已上传: ${percent}%`); onProgress({ percent }); } }) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值