简体   繁体   English

下拉列表的超链接

[英]drop down list of hyperlinks

In a spring mvc application JSP page, I am trying to simplify the layout by giving the user a drop down list from which to select a desired action. 在spring mvc应用程序JSP页面中,我试图通过为用户提供一个下拉列表来简化布局,从中可以选择所需的操作。 The items in the drop down list would each correspond with a different url for other JSPs to which the user would be directed. 下拉列表中的项目将分别对应于用户将指向的其他JSP的不同URL。 This would make the user interface a lot cleaner than having a separate button for each possible URL. 这将使用户界面比为每个可能的URL单独按钮更清晰。 How do I set this up in code? 如何在代码中设置它?

Here is the jsp code in Spring Expression Language for creating the drop down list that I have so far: 这是Spring Expression Language中用于创建到目前为止的下拉列表的jsp代码:

<form:select path="AddLink" cssClass="textArea">
    <option value="Select" label=" - Select - " ></option>
    <form:options items="${AddLinks}"/>
</form:select>

Here are the methods in the controller for populating the drop down list and then for handling its selection that I have so far: 以下是控制器中的方法,用于填充下拉列表,然后处理我到目前为止的选择:

@RequestMapping(value = "/encounters", method = RequestMethod.GET)
public String processFindForm(@RequestParam("encounterID") String encounterId, Encounter encounter, BindingResult result, Map<String, Object> model) {
    int encountId = Integer.parseInt(encounterId);
    Encounter sel_encounter = this.clinicService.findEncounterById(encountId);//I added this
    HashMap<String,String> AddLinks = new HashMap<String,String>();
    AddLinks.put("New this","/thislink");
    AddLinks.put("New that","/thatlink");
    AddLinks.put("New other thing","/otherlink");
    model.put("sel_encounter",sel_encounter);
    ((Model) model).addAttribute("AddLinks", AddLinks);
    return "encounters/encountersList";
}

@RequestMapping(value = "/encounters", method = RequestMethod.POST)
public String processFindForm(@ModelAttribute("encounter") Encounter encounter, @ModelAttribute("AddLink") String addLink, BindingResult result, SessionStatus status) {
    int encountId = encounter.getId();
    System.out.println("............ addLink is:  "+addLink);
    return "/"+addLink;
}

This is causing the following stack trace: 这导致以下堆栈跟踪:

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/encounters/encountersList.jsp at line 116

113:                 <spring:url value="" var="medications_newUrl"></spring:url>
114:                 <a href="${fn:escapeXml(medications_newUrl)}" class="btn btn-info" >Add New Medication</a>
115:
116: <form:select path="AddLink" cssClass="textArea">
117:     <option value="Select" label=" - Select - " ></option>
118:     <form:options items="${AddLinks}"/>
119: </form:select>

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:465)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
com.github.dandelion.datatables.extras.servlet2.filter.DatatablesFilter.doFilter(DatatablesFilter.java:71)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause 
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'AddLink' available as request attribute
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:179)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:199)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:165)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:152)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:143)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:127)
org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421)
org.springframework.web.servlet.tags.form.SelectTag.writeTagContent(SelectTag.java:200)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:103)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
org.apache.jsp.WEB_002dINF.jsp.encounters.encountersList_jsp._jspx_meth_form_005fselect_005f0(encountersList_jsp.java:1396)
org.apache.jsp.WEB_002dINF.jsp.encounters.encountersList_jsp._jspService(encountersList_jsp.java:405)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
com.github.dandelion.datatables.extras.servlet2.filter.DatatablesFilter.doFilter(DatatablesFilter.java:71)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

For reference, here are the taglibs included at the top of the JSP: 作为参考,这里是JSP顶部包含的taglib:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="datatables" uri="http://github.com/dandelion/datatables" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="joda" uri="http://www.joda.org/joda/time/tags" %>

NOTE: I think the problem is from using atModelAttribute to pass a string into the controller method. 注意:我认为问题是使用atModelAttribute将字符串传递给控制器​​方法。 I think the error means that spring is looking for an object AddLink when I just want to pass a string. 我认为错误意味着当我只想传递一个字符串时,spring正在寻找一个AddLink对象。 Does this help you see the solution? 这有助于您了解解决方案吗?


EDIT: 编辑:

By changing all the AddLink references to AddLinks , I got the JSP to compile with a drop down list of the link choices, but selecting any of the choices has NO EFFECT. 通过将所有AddLink引用更改为AddLinks ,我使用链接选项的下拉列表编译JSP,但选择任何选项都没有效果。 The JSP does not redirect, and the System.out.println() in the POST controller method does not print anything out, indicating that the POST controller method has not been called. JSP不重定向, POST控制器方法中的System.out.println()不会打印任何内容,表明尚未调用POST控制器方法。

Here is the only code that I changed: 这是我改变的唯一代码:

// in the JSP
<form:select path="AddLinks" cssClass="textArea">
    <option value="Select" label=" - Select - " ></option>
    <form:options items="${AddLinks}"/>
</form:select>  

// in the controller
@RequestMapping(value = "/encounters", method = RequestMethod.POST)
public String processFindForm(@ModelAttribute("encounter") Encounter encounter, @ModelAttribute("AddLink") String AddLinks, BindingResult result, SessionStatus status) {
    int encountId = encounter.getId();
    System.out.println("............ addLink is:  "+AddLinks);
    return "/"+AddLinks;
}

The complete JSP can be found on a file sharing site at this link . 可以在此链接的文件共享站点找到完整的JSP。

Similar like @looser I would also argue you'd better off coding this on client side using javascript, but anyway here's the server side answer: 类似于@looser我也会争辩你最好在客户端使用javascript编码,但无论如何这里的服务器端答案:

Firstly I think you forgot to model.addAttribute("AddLinks", AddLinks) . 首先,我认为您忘记了model.addAttribute("AddLinks", AddLinks) I can see you're creating a HashMap which never gets added to the model. 我可以看到你正在创建一个永远不会添加到模型中的HashMap。

Secondly in processFindForm you can return the string "redirect:/blah" to give a HTTP 3xx redirect into /blah URI. 其次在processFindForm您可以返回字符串“redirect:/ blah”以将HTTP 3xx重定向到/blah URI。 The redirection URL is relative to your context path. 重定向URL与您的上下文路径相关。

Read more about spring view redirection here . 阅读更多关于弹簧视图重定向的信息

try this, 尝试这个,

Modify your Encounter class to hold a value of selectedLink like: 修改您的Encounter类以保存selectedLink的值,如:

public class Encounter {

    private String selectedLink;

    //getters and setters

} 

then, in controller to add a AddLinks options as a modelAttribute do like this: 然后,在控制器中添加一个AddLinks选项作为modelAttribute,如下所示:

    public String getFindForm(Model model){
        model.addAttribute("enctr",new Encounter());
        return "AddLink";
    }

    @RequestMapping(method=RequestMethod.POST)
    public String processFindForm(@ModelAttribute("enctr")Encounter encounter){
        System.out.println(encounter.getSelectedLink());    

        return "AddLink";//"redirect:"+encounter.getSelectedLink();
    }

    @ModelAttribute("addLinkOptions")
    public Map loadLinkOptions(){
        LinkedHashMap<String, String> addLinks = new LinkedHashMap<String,String>();
        addLinks.put("/thislink","New this");
        addLinks.put("/thatlink","New that");
        addLinks.put("/otherlink","New other thing");
        return addLinks;
    }

and in your jsp add a spring form:form tag to perform action. 并在你的jsp中添加一个spring form:form标签来执行动作。

    <form:form method="post" modelAttribute="enctr">
        SelectLink:
        <form:select path="selectedLink">
            <form:option value="NONE">--select--</form:option>
            <form:options items="${addLinkOptions}"/>
        </form:select>

        <input type="submit"/>
    </form:form>

Okay i am not familiar with Spring MVC but in your requirement 好吧,我不熟悉Spring MVC,但是在你的要求中

 onChange or onSelect event is enough

<form:select path="AddLink" cssClass="textArea" onChange='setAction()' >
<option value="Select" label=" - Select - " ></option>
<form:options items="${AddLinks}"/>
</form:select>

In javaScript

  <script type="text/javascript">

        function setAction()
        {
           var temp = document.getElementById("selectTagID"); 
           var action = temp.options[temp.selectedIndex].value;//get Selected option key value
            document.form_name.action =action;//Send the action
             document.form_name.submit();//Submit the form

        }
  </script>   

Where in your Otions list make those actions are available .. as keys for that selected options 您的Otions列表中的位置使这些操作可用..作为所选选项的键

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM