2

我继承了一个代码库,该代码库主要包含 JSP 脚本,这些脚本很快变得难以阅读,例如,这是执行分页链接的片段:

Visa:
<a class="link" href="javascript:doSubmit('MenyNavigation', 'REW_<%= thisPage %>')" > 
   <%
     if(headPointer - nrOfHitsOnPage > 0){
         out.print(" << ");
         if(tailPointer - nrOfHitsOnPage <= 0 ){
             out.print(1);
         } else {
             out.print(tailPointer - nrOfHitsOnPage);
         }
         out.print("-");
         out.print(tailPointer);
      } %>
</a>
&nbsp;
<% if(resultListSize > 0 ) { %>
   <%=(tailPointer + 1)%> - <%= headPointer %>
<%}%>
&nbsp;
<a class="link" href="javascript:doSubmit('MenyNavigation', 'FWD_<%= thisPage %>')" > 
   <%   
     if(headPointer < resultListSize){
         out.print(1 + headPointer);
         out.print("-");                 
         if(headPointer + nrOfHitsOnPage > resultListSize){
             out.print(resultListSize);
         } else {
             out.print(nrOfHitsOnPage + headPointer);
         }
         out.print(" >> ");
      } %>
</a>

显然,当每页有 10 个元素且总共有 20 个元素时,此代码显示文本“Display 1-10 of 20”,对于其他设置也是如此,但我认为此解决方案不是很可重用。代码已经在我们项目的一个地方使用过,我们决定如果我们有一个问题的解决方案,如果它们出现在不同的地方,我们将对相同的问题使用相同的解决方案,现在我必须为 > 5 个弹出窗口进行分页(!)具有搜索功能,我想知道是否使用此代码来制作模拟解决方案或从头开始构建。

控制器 Java 类也没有那么高的内聚性:

public class MenyNavigationActionHandler extends PandoraActionHandler {

    private ArendeProcessSessionData sessionData;
    private final static Logger logger = Logger
            .getLogger(MenyNavigationActionHandler.class);

    protected IFormData getFormData() {
        return null;
    }

    protected IFormPattern getPattern() {
        return EmptyFormPattern.getInstance();

    }

    protected void performAction(ISessionHandler sessionHandler, Action action) {

        String returnPage = null;       

        try {

            sessionData = (ArendeProcessSessionData) sessionHandler.getSessionData();

            if(sessionData.returnToUnsavedData(sessionHandler, action)){
                return;
            }


            if (sessionData.getMenuManager() == null) {

                MenuManager menuManager = new MenuManager();
                sessionData.setMenuManager(menuManager);
            }

            // Om man bläddar i träfflista på formell kontrollista
            if (action.getActionCommand().endsWith(ArendeProcessLocator.getFormellKontrollLista())) {

                FormellKontrollInfo fInfo = sessionData.getFormellKontrollInfo();
                FormellKontrollSearchAdmin fSearch = fInfo.getFormellKontrollSearchAdmin();

                if(fInfo != null) {

                    if (action.getActionCommand().startsWith("FWD")) {

                        fSearch.setDirection(PandoraConstants.FWD_DIRECTION);

                    } else if (action.getActionCommand().startsWith("REW")) {
                        fSearch.setDirection(PandoraConstants.REW_DIRECTION);

                    } else {
                        fSearch.setDirection(PandoraConstants.NO_DIRECTION);
                    }
                }

                returnPage = ArendeProcessLocator.getFormellKontrollLista();
                action.setReturnPage(returnPage);

            } else if (action.getActionCommand().equalsIgnoreCase(
                    ArendeProcessLabelConstants.SUB_MENU_VISA_REGISTRERADE)) {

                sessionData.setNyinkomnaLista(null);

                MenuManager menuManager = sessionData.getMenuManager();
                returnPage = menuManager.getLatestDestination(action.getActionTarget());

                if (returnPage == null) {

                    returnPage = action.getCurrPage();
                }

                action.setReturnPage(returnPage);

            } else {
                // Standard hantering av menyval. Target från Navigation-objekt hämtas från action.getActionModifier
                MenuManager menuManager = sessionData.getMenuManager();
                if(action.getActionTarget() != null && !action.getActionTarget().trim().equals("")){
                    returnPage = menuManager.getLatestDestination(action.getActionTarget());
                }else{
                    returnPage = menuManager.getLatestDestination(sessionData.getLatestActionTarget());
                }
                if (returnPage == null) {
                    returnPage = action.getCurrPage();
                }
                action.setReturnPage(returnPage);
            }

            if(action.getCurrPage().endsWith(ArendeProcessLocator.getNyregistrering())){
                   // Nytt önskemål, Kom ihåg innehållet på registrera sidan när vi går till listan  2010-12-02
                   sessionData.getNyregistrering().setKundReferens(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_KUNDREFERENS));
                   sessionData.getNyregistrering().setSokEfternamn(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_SOKEFTERNAMN));
                   sessionData.getNyregistrering().setSokFornamn(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_SOKFORNAMN));
                   sessionData.getNyregistrering().setForetag(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_FORETAG));
                   sessionData.getNyregistrering().setSokandeLandKod(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_SELECT_SOKANDELAND));
                   sessionData.getNyregistrering().setAnkomstDatum(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_ANKOMSTDAG));
                   sessionData.getNyregistrering().setOriginal("original".equals(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_HANDLINGSFORM))? true : false);
                   sessionData.getNyregistrering().setArendeNummer(sessionHandler.getRequestParameter(PandoraFieldConstants.FIELD_ARENDENUMMER));
                             //printer ??
             }

            if(!action.getCurrPage().endsWith(ArendeProcessLocator.getNyinkomnaLista2()) && action.getReturnPage().endsWith((ArendeProcessLocator.getNyregistrering()))){
                   // Rensa minnet av registrera sidan om det inte är listan med registrerade man kommer ifrån
                   sessionData.getNyregistrering().setKundReferens("");
                   sessionData.getNyregistrering().setSokEfternamn("");
                   sessionData.getNyregistrering().setSokFornamn("");
                   sessionData.getNyregistrering().setForetag("");
                   sessionData.getNyregistrering().setSokandeLandKod("");
                   sessionData.getNyregistrering().setAnkomstDatum("");
                   sessionData.getNyregistrering().setOriginal(true);
                   sessionData.getNyregistrering().setArendeNummer("");
             }

             if(action.getActionCommand().equals(ArendeProcessLocator.getNyinkomnaLista())){
                   sessionData.setNyinkomnaLista(null);
              }


        } catch (Exception e) {

            logger.error("MenyNavigationActionHandler: performAction() ", e);
        }

    }

} 

我可以与编写代码的同事联系,并可以请他指导我应该拥有哪些文件,以便分页可以正常工作,但我想要一个干净且精简的解决方案,没有文字,从头开始需要做很多工作而不是使用脚本。

你觉得我应该怎么做?只需使用上面的脚本,使它们适用于我的用例,然后尽可能重构为 JSTL 标记和 EL?任何其他评论如何重用 Java / JSP 代码进行分页?我们的框架是相当特殊和定制的,我们没有使用 struts 或 spring 或 jsf,而是我们自己的框架,因为它非常依赖会话数据,所以有点复杂。

任何答案或评论表示赞赏。

4

1 回答 1

1

我认为这取决于这段代码有多少,以及你是否有时间花在使它更易于维护上。我认为除了你(和你的老板)之外没有人能回答这个问题。

关于如何实现这种东西的问题,你可以选择标准的 JSTL 标签库或者自己实现,或者组合。如果将 taglibs 与 EL 结合使用,您可以做得更多。会话属性不应该是一个特别的问题。

不过有一点建议。JSTL 和 JSP EL 的表现力越来越强,因此升级到实现最新版 Servlet 规范的 servlet 容器可能是值得的。

于 2012-06-04T12:04:45.990 回答