No result defined for action and result input

本文通过实例解析了Struts2框架中NoResult问题的两种常见原因:未定义input处理结果及Action名称的选择。文章详细介绍了如何正确配置Struts2的拦截规则,避免NoResult异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于struts编程中,No result defined for action and result input 问题,查了一些资料,目前遇到的原因有一下两个


<struts>
 	<package name="struts2" extends="struts-default">
 		<!-- 定义register的Action,其实现类为com.javaweb.action.RegisterAction-->
 		<action name="MyRegister" class="com.javaweb.action.RegisterAction">
 			<!-- 定义处理结果与视图资源之间的关系-->
 			<result name="success">/index.jsp</result>
 			<result name="input">/register.jsp</result>
 		</action>
 	</package>
 </struts>  

请看以上代码。

问题1:一开始没有添加 result name="input" 这句代码,结果返回错误,由于 在action中,如果出现错误将默认 返回 input参数,所以必须定义 该处理结果

问题2:请看 action name="MyRegister" 这句,一开始 我写的是 name'="register" ,结果 no result 。。。那个错误一直困扰了我好几天,后来终于弄明白了,

name 的值不能是 login 或者 register 等,当然可能还与 编译器有关,我用的是 myeclipse blue最新版,struts2 环境是直接利用编译器配置的,但是如果直接

自己配置貌似又可以用 login 等,这个问题有待研究。。

在提供的代码片段中,确实存在一个引用错误:“ReferenceError: originColums is not defined”。此错误发生在尝试使用 `originColums` 变量之前未正确初始化它。具体来说,在 `setup` 函数中,`originColums` 应该被定义并初始化为空数组或所需的初始值。 以下是修正后的代码: ```javascript <template> ... </template> <script> import Vue from 'vue' import { ref, reactive, onMounted } from '@vue/composition-api'; import MyFastDatePicker from '@/components/date/MyFastDatePicker' import '@/assets/less/TableExpand.less' import { mixinDevice } from '@/utils/mixin' import { JeecgListMixin } from '@/mixins/JeecgListMixin' export default { name: 'ProjectMaterialDetails', mixins: [JeecgListMixin, mixinDevice], components: { MyFastDatePicker }, setup(props, context) { const state = reactive({ nowFirst: 'projectCode', columnsKey: 0, projectNameList: [], projectName_Code: '', projectBudgetMarginWarning: 0, expandedRowKeys: [], workorderProjectList: [], description: '营业报表管理页面', fastTime: ['本月', '上月', '近半年'], noCreate: true, hasUpdateTime: true, configOrderSubTypeList: [], configOrderSubTypeTemp: undefined, allDepartList: [], hallCodeDataList: [], spinning: false, checkFlag: true, updateTime: '', url: { list: "/web/materialVoucherDetails/getProjectMaterialStatistic", exportXlsxUrl: "/web/materialVoucherDetails/exportProjectMaterialStatisticExcel", exportPdfUrl: "/web/bizBusinessRecord/exportpdf", exportDetailUrl: "/web/bizBusinessRecord/exportDetailExcel" }, keyList: ['saleNum', 'saleName', 'terminalTypeName', 'userTypeName', 'configOrderMainTypeName', 'configOrderSubTypeName'], ipagination: { current: 1, pageSize: 20, pageSizeOptions: ['20', '50', '80'], showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`, showQuickJumper: true, showSizeChanger: true, total: 0 }, originColums: [], // 初始化 originColums columns: [ { title: '项目编号', align: "center", dataIndex: 'projectCode', customRender: (text, row, index) => renderMergedCells(text, row, index, 'projectCode') }, { title: '项目名称', align: "center", dataIndex: 'projectCode_dictText', customRender: (text, row, index) => renderMergedCells(text, row, index, 'projectCode_dictText') }, { title: '(子)项目名称', align: "center", dataIndex: 'subProjectCode_dictText', customRender: (text, row, index) => renderMergedCells(text, row, index, 'subProjectCode_dictText') }, { title: '部门名称', align: "center", dataIndex: 'orgCode_dictText', customRender: (text, row, index) => renderMergedCells(text, row, index, 'orgCode_dictText') }, { title: '物资编号', align: "center", dataIndex: 'materialCode', scopedSlots: { customRender: 'publicText' } }, { title: '物资名称', align: "center", dataIndex: 'materialName', scopedSlots: { customRender: 'publicText' } }, { title: '厂商', align: "center", dataIndex: 'producerId_dictText', scopedSlots: { customRender: 'publicText' } }, { title: '规格型号', align: "center", dataIndex: 'specification', scopedSlots: { customRender: 'publicText' } }, { title: '单位', align: "center", dataIndex: 'unit', scopedSlots: { customRender: 'publicText' } }, { title: '成本价(元)', align: "center", dataIndex: 'originPrice', scopedSlots: { customRender: 'publicText' } }, { title: '领用总数', align: "center", dataIndex: 'requisitionNum', slots: { title: 'requisitionNum_title' }, scopedSlots: { customRender: 'publicText' } }, { title: '施工用料', align: "center", dataIndex: 'constructionNum', scopedSlots: { customRender: 'publicText' } }, { title: '验收用料', align: "center", dataIndex: 'acceptanceNum', scopedSlots: { customRender: 'publicText' } }, { title: '结算用料', align: "center", dataIndex: 'settlementNum', scopedSlots: { customRender: 'publicText' } }, { title: '结算余料', align: "center", dataIndex: 'settlementRemainNum', scopedSlots: { customRender: 'settlementRemainNum' } }, { title: '盘点余料', align: "center", dataIndex: 'inventoryRemainNum', scopedSlots: { customRender: 'publicText' } }, { title: '盘点损益', align: "center", dataIndex: 'inventoryProfitAndLossNum', slots: { title: 'inventoryProfitAndLossNum_title' }, scopedSlots: { customRender: 'inventoryProfitAndLossNum' } } ], queryParam: { type: '', projectCode: '', projectName: '', projectName_Code: "", subProjectName: '', departId: '', material: '', producerId: '', specification: '', materialInventoryResult: '', projectDateBegin: '', projectDateEnd: '' }, dataSource: [], loading: false, toggleSearchStatus: false }); const renderMergedCells = (value, row, index, dataIndex) => { const obj = { children: value, attrs: {} }; const dataSource = state.dataSource; if (dataIndex === 'projectCode') { if (index === 0 || row.projectCode_dictText !== dataSource[index - 1].projectCode_dictText) { let rowSpan = 1; for (let i = index + 1; i < dataSource.length; i++) { if (dataSource[i].projectCode_dictText === row.projectCode_dictText) { rowSpan++; } else { break; } } obj.attrs.rowSpan = rowSpan; } else { obj.attrs.rowSpan = 0; } } else if (dataIndex === 'orgCode_dictText') { if (index === 0 || row.orgCode_dictText !== dataSource[index - 1].orgCode_dictText || row.projectCode_dictText !== dataSource[index - 1].projectCode_dictText) { let rowSpan = 1; for (let i = index + 1; i < dataSource.length; i++) { if (dataSource[i].orgCode_dictText === row.orgCode_dictText && dataSource[i].projectCode_dictText === row.projectCode_dictText) { rowSpan++; } else { break; } } obj.attrs.rowSpan = rowSpan; } else { obj.attrs.rowSpan = 0; } } else { if (index === 0 || row.subProjectCode_dictText !== dataSource[index - 1].subProjectCode_dictText) { let rowSpan = 1; for (let i = index + 1; i < dataSource.length; i++) { if (dataSource[i].subProjectCode_dictText === row.subProjectCode_dictText) { rowSpan++; } else { break; } } obj.attrs.rowSpan = rowSpan; } else { obj.attrs.rowSpan = 0; } } return obj; }; const materialInventoryResultChange = (val) => { state.queryParam.materialInventoryResult = val; forceUpdate(); }; const beforeSearchQuery = () => { searchQuery(); departChange(state.queryParam.type); }; const beforeSearchReset = () => { searchReset(); departChange(); }; const deepClone = (input, hash = new WeakMap()) => { if (input === null || typeof input !== 'object') { return input; } if (hash.has(input)) { return hash.get(input); } let output = Array.isArray(input) ? [] : {}; hash.set(input, output); if (Array.isArray(input)) { output = input.map(item => deepClone(item, hash)); } else { for (let key in input) { if (input.hasOwnProperty(key)) { if (typeof input[key] === 'function') { output[key] = input[key].bind(output); } else { output[key] = deepClone(input[key], hash); } } } } return output; }; const departChange = (val) => { if (val == 2) { state.nowFirst = 'orgCode_dictText'; let objectArray = deepClone(state.originColums); let movedElement = objectArray.splice(3, 1)[0]; objectArray.unshift(movedElement); state.columns = objectArray; } else { state.nowFirst = 'projectCode'; state.columns = deepClone(state.originColums); } state.columnsKey += 1; }; const subProjectCodeChange = (val, options) => { console.log('subProjectCodeChange', val, options, state.queryParam.subProjectName); }; const projectCodeSearch = (value) => { getAction('/web/projectRecord/searchMainProject', { order: 'desc', pageNo: 1, pageSize: 100, keyword: value }).then(res => { state.projectNameList = res.result.map(item => ({ id: item.id, value: item.projectCode, text: item.projectName })); }); }; const projectCodeChange = (value) => { state.queryParam.projectName_Code = value; const obj = state.projectNameList.find(item => item.id === value); if (obj) { state.exportParams.projectName = obj.text; state.queryParam.projectName = obj.text; } else { state.exportParams.projectName = ''; state.queryParam.projectName = ''; } }; const change = (val1, val2, val3) => { console.log('改变', val3); state.exportParams.dateTpye = val3 === 2 ? 1 : 2; state.queryParam.projectDateBegin = val1; state.queryParam.projectDateEnd = val2; state.queryParam.hiddenZeroTotalAmountFlag = state.checkFlag ? 1 : 0; }; const handelChange = () => { state.configOrderSubTypeTemp = undefined; state.queryParam.configOrderSubType = undefined; state.queryParam.incomeExpenseType = ''; getConfigOrderSubTypeList(); }; const getConfigOrderSubTypeList = () => { if (state.queryParam.configOrderMainType) { getAction('/web/bizTransactionOrder/getOrderSubType', { configOrderMainType: state.queryParam.configOrderMainType }).then(res => { if (res.code == 200) { switch (state.queryParam.configOrderMainType) { case '1': let arr = []; for (let i = 0; i < res.result.length; i++) { arr.push(res.result.slice(i, i + 1)); } arr.forEach(v => { v.push({ value: v[0].value, label: v[0].label + '(退)' }); }); let result = [].concat.apply([], arr).filter(v => v.value != 96 && v.value != 98); state.configOrderSubTypeList = result; break; case '2': state.configOrderSubTypeList = res.result.filter(v => Number(v.value) <= 7 || Number(v.value) == 15 || Number(v.value) == 16 || Number(v.value) == 20 || Number(v.value) == 21); break; case '3': state.configOrderSubTypeList = res.result.filter(v => Number(v.value) !== 7 && Number(v.value) !== 8 && Number(v.value) !== 12 && Number(v.value) !== 14 && Number(v.value) !== 10 && Number(v.value) !== 16); break; default: state.configOrderSubTypeList = res.result; break; } } }); } else { Vue.prototype.$message.warning('请选择业务类型!'); } }; const handleChange = (val) => { state.configOrderSubTypeList = []; state.queryParam.configOrderSubType = ''; state.configOrderSubTypeTemp = undefined; state.queryParam.incomeExpenseType = ''; }; const handleConfigOrderSubTypeChange = (val) => { state.configOrderSubTypeTemp = val; if (state.queryParam.configOrderMainType == 1) { state.queryParam.incomeExpenseType = val.key.substr(val.key.length - 1, 1); } else { state.queryParam.incomeExpenseType = ''; } }; const handleOpen = (record) => { }; const filterOption = (input, option) => { return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0; }; const searchQuery = () => { let val = state.configOrderSubTypeTemp; if (val) { if (state.queryParam.configOrderMainType == 1) { if (val.key.length == 2) { state.queryParam.configOrderSubType = val.key.substr(0, 1); } else { state.queryParam.configOrderSubType = val.key.substr(0, 2); } } else { state.queryParam.configOrderSubType = val.key; } } loadData(1); }; const searchReset = () => { state.queryParam.type = ''; state.queryParam.projectName = ''; state.queryParam.subProjectName = ''; state.queryParam.departId = ''; state.queryParam.material = '';
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值