SSH开发问题-修改页面校验失败后返回原来页面(非OGNL)

在SSH开发中,遇到修改页面校验失败时无法正确显示错误信息的问题。尝试通过chain调用pageAction的showUpdateNotice方法,虽然能保留表单数据,但错误消息丢失。直接跳转则会导致表单信息丢失。解决方案是在pageAction中将notice对象存入session,确保页面跳转后仍能访问错误信息。

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

记录2016-06-16大三SSH综合实训课

今天做结课作品遇到一个问题,就是当修改业务页面因为校验失败时返回原来的修改页面出现问题。
试着解决问题,用了不同方法:

<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="java.text.*" %>
<%@ page import="java.util.*"%>
<%@ page import="com.doctorFamily.domain.*"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<div class="main-container" id="main-container">
    <div class="main-container-inner">
        <div class="main-content">
            <!--<div class="navbar navbar-default" id="navbar">-->
            <div class="page-content">
                <%
                    Notice notice = (Notice)request.getSession().getAttribute("singleNotice");
                        if(notice == null) out.print("获取失败");
                        if(notice != null){
                %>
                <!--<div class="row">-->

                <!-- PAGE CONTENT BEGINS -->
                <form class="form-horizontal" role="form"
                    action="<%=request.getContextPath()%>/notice/notice_UpdateNotice"
                    method="post">

                    <!--    隐藏公告编号以作为主键进行修改 -->
                    <input type="hidden" name="notice.no" value="<%=notice.getNo()%>"/>
                    <input type="hidden" name="notice.createTime" value="<%=notice.getCreateTime()%>"/>

                    <div class="form-group">
                        <div class="col-sm-6">
                            <h4 class="header green">标题</h4>
                            <div class="col-sm-6">
                                <input name="notice.title" type="text" id="residentId"
                                    placeholder="标题" value="<%=notice.getTitle() %>"/>
                            </div>
                        </div>
                    </div>
                    <s:fielderror cssStyle="color:red; margin-bottom:0px; list-style:none;">  
                        <s:param>notice.title</s:param>  
                    </s:fielderror>
                    <div class="space-4"></div>
                    <div class="form-group">
                        <div class="col-sm-6">
                            <h4 class="header green">类别</h4>
                            <div class="col-sm-6">
                                <select name="notice.type">
                                    <option value="1" <%if(notice.getType()==1) {out.print("selected='selected'");} %> >公告通知</option>
                                    <option value="2" <%if(notice.getType()==2) {out.print("selected='selected'");} %> >行业新闻</option>
                                </select>
                            </div>
                        </div>
                    </div>
                    <div class="space-4"></div>
                    <div class="form-group">
                        <div class="col-sm-6">
                            <h4 class="header green">内容</h4>
                            <div class="widget-box">
                                <div class="widget-header widget-header-small header-color-green"></div>
                                <div class="widget-body">
                                    <div class="widget-main no-padding">
                                        <div class="wysiwyg-editor" id="editor2">
                                            <%=notice.getContent() %>
                                            <input id="noticeContent" type="hidden" name="notice.content"/>
                                        </div>
                                    </div>
                                    <s:fielderror cssStyle="color:red; margin-bottom:0px; list-style:none;">  
                                        <s:param>notice.content</s:param>  
                                    </s:fielderror>
                                    <div class="widget-toolbox padding-4 clearfix">
                                        <div class="btn-group pull-right">
                                            <button class="btn btn-sm btn-success" type="submit" onclick="getContent()">
                                                <i class="icon-globe bigger-125"></i>发&nbsp;布 <i
                                                    class="icon-arrow-right icon-on-right bigger-125"></i>
                                            </button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <!-- PAGE CONTENT ENDS -->
                </form>
                <!-- /.col -->
                <!--</div>-->
                <!-- /.row -->
                <%
                        }
                %>
            </div>
            <!-- /.page-content -->
            <!-- /.main-content -->

            <!--</div>-->
            <!-- /.main-container-inner -->
        </div>
    </div>
</div>
</div>
<!-- 获取div中的文本信息 -->
<script type="text/javascript">
    function getContent(){
        var content = document.getElementById('editor2').innerText;
        document.getElementById('noticeContent').value = content;
    }
</script>

用chain启用pageAction的showUpdateNotice方法重返修改页面:

<!-- NoticeAction -->
    <package name="notice" extends="struts-default" namespace="/notice">
        <action name="notice_*" class="noticeAction" method="do{1}">
            <result name="operateSuccess" type="chain">
                <param name="actionName">page_showAllNotice</param>
                <param name="namespace">/page</param>
            </result>
            <result name="input" type="chain"> 
                <param name="actionName">page_show{1}</param> 
                <param name="namespace">/page</param> 
            </result> 
        </action>
    </package>

当校验失败返回修改页面时表单信息能正确显示,但错误提示消息丢失无法显示,分析原因就是重新请求action时,因为重定向导致request丢失携带的错误信息,而notice因为pageAction重新获取表单信息。
直接跳转到<result name="input"> 重返修改页面

    <!-- NoticeAction -->
    <package name="notice" extends="struts-default" namespace="/notice">
        <action name="notice_*" class="noticeAction" method="do{1}">
            <result name="operateSuccess" type="chain">
                <param name="actionName">page_showAllNotice</param>
                <param name="namespace">/page</param>
            </result>
            <result name="input">/background/show{1}.jsp</result> 
        </action>
    </package>

当校验失败返回修改页面时表单信息无法正确显示,分析原因就是重定向返回修改页面时request丢失了notice对象而没有重新获取。

**解决方法:
在pageAction中showUpdateNotice方法中讲查询得到的notice对象存放到session中,这样页面之间的跳转不会影响notice对象的存放**

    public String showUpdateNotice() {
        HttpServletRequest request = ServletActionContext.getRequest();
//      request.setAttribute("singleNotice",
//              noticeService.getNoticeById(noticeID));
        request.getSession().setAttribute("singleNotice", 
                noticeService.getNoticeById(noticeID));
        return "background";
    }

当然最好的解决方法还是OGNL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值