Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC:我可以将JSTL导入标记URL指向相对于当前控制器的端点吗_Java_Jsp_Spring Mvc_Servlets_Jstl - Fatal编程技术网

Java SpringMVC:我可以将JSTL导入标记URL指向相对于当前控制器的端点吗

Java SpringMVC:我可以将JSTL导入标记URL指向相对于当前控制器的端点吗,java,jsp,spring-mvc,servlets,jstl,Java,Jsp,Spring Mvc,Servlets,Jstl,我正在开发两个继承类似行为的JSP。我试图通过拥有一个基本控制器和jsp来实现这一点,它提供了基本的行为,并使用标记来点击在基本控制器的子类中定义的端点以获得更多的内容。我在定义导入标记的url以从子类控制器命中正确的端点时遇到问题 基本控制器: @Controller public abstract class AbstractController { @RequestMapping(value = "/main") public String getForm() {

我正在开发两个继承类似行为的JSP。我试图通过拥有一个基本控制器和jsp来实现这一点,它提供了基本的行为,并使用
标记来点击在基本控制器的子类中定义的端点以获得更多的内容。我在定义导入标记的url以从子类控制器命中正确的端点时遇到问题

基本控制器:

@Controller
public abstract class AbstractController {

    @RequestMapping(value = "/main")
    public String getForm() {
        return "MyForm";
    }

    @RequestMapping(value = "/customForm")
    public abstract String getCustomForm();
}
MyForm.jsp

<c:import url="/customForm" />
另一个实现可能类似于:

@RequestMapping(value = "/myController2")
public class MyController2 extends AbstractController {

    @Override
    public String getCustomForm() {
        return "MyCustomForm2";
    }

}
在本例中,它不起作用,因为导入的URL引用了
/customForm
,但它需要引用
/myController/customForm
/myController2/customForm
,这取决于访问哪个控制器来提供初始页面(
/myController/main
/myController2/main

使用标准的
标记有什么方法可以实现这种行为吗


我曾想过在
/main
端点中获取请求路径,提取控制器的映射,然后将其添加为模型属性,然后我可以在jsp上访问该属性以构建URL,但我觉得必须有更好的方法来实现这一点。有人有什么想法吗?

我相信你可以简单地实现你的目标寻找

您的配置如下所示 //请注意tiles占位符

 <form:form id="add_update_form" modelAttribute="mymodel" action="${ctx}/views/sections/action" method="post">
        <tiles:insertAttribute name="header" />

         <tiles:insertAttribute name="content" />

        <tiles:insertAttribute name="footer" />

    </form:form>
现在,您的开发人员将不需要扩展控制器,他们只需要添加一个新的tile定义,扩展baseForm定义并提供新的jsp部分

in //tiles-layout.xml,&  put contents of the placeholder

    <definition name="newSection" extends="baseFrom">
             <put-attribute name="content" value="/WEB-INF/views/sections/newSectionForm.jsp"/>
        </definition>
在//tiles layout.xml中,放置占位符的内容(&P)

根据我在您的问题中看到的情况,您可以将控制器映射捕获为路径变量,并基于此解析视图。例如,在AbstractController中添加以下映射


您是否介意在此处尝试实现的内容中添加更多上下文>我正在开发两个继承类似行为的JSP。例如?您是否愿意采用不同的方法?基本上,我的应用程序将有大量表单,所有表单都包含相同的基本信息,例如名称和描述字段以及更多的说明符ic字段。当我提交表单时,行为都是相同的,因此我想将其封装在一个控制器中,这样开发人员就可以通过扩展控制器并返回表单的自己部分来添加新表单。主表单将包含绑定表单内容并将其发布到端点的逻辑,该端点由父级控制器将处理。当我将JSP中的数据发回控制器时,我本质上是在发回一个JSON对象,其中包含自定义表单上的字段,因此处理发回的端点必须弄清楚如何处理JSON中返回的各种数据。我的做法是使用generi父控制器中的cs,这样post端点将采用上述建议的方法,只是一个表单,有许多节,即所有模块都是相同的modelAttribute。Mainform可以有一个modelAttribute a和两个字段,Section1将有一个modelAttribute,该modelAttribute通过节特定字段扩展a,Section2 modelAttribute will还使用特定于节的字段等扩展A。现在,当提交给控制器时,您的Json将包含一个字段和一个特定于节的字段,您可以使用一些A
s字段从DB获取域模型的新副本,假设其他节已更新,并使用当前节的数据更新域并保存它
//tiles-layout.xml notice the contents of the placeholders defined above

<tiles-definitions>
    <!-- Abstract root definition -->
     <definition name="baseFrom" template="/WEB-INF/jsp/base/tiles/base.jsp">
        <put-attribute name="header" value="/WEB-INF/jsp/base/tiles/formheader.jsp"/>
        <put-attribute name="content" value=""/>
        <put-attribute name="footer" value="/WEB-INF/jsp/base/tiles/formfooter.jsp"/>
    </definition>

     <definition name="main" extends="baseFrom">
         <put-attribute name="content" value="/WEB-INF/views/sections/main.jsp"/>
    </definition> 
     <definition name="section1" extends="baseFrom">
         <put-attribute name="group" cascade="true" value="Terms"/>
         <put-attribute name="content" value="/WEB-INF/views/sections/section1Form.jsp"/>
    </definition>

    <definition name="section2" extends="baseFrom">
         <put-attribute name="group" cascade="true" value="Terms"/>
         <put-attribute name="content" value="/WEB-INF/views/sections/section2Form.jsp"/>
    </definition>

    <definition name="section3" extends="baseFrom">
         <put-attribute name="content" value="/WEB-INF/views/sections/section2Form.jsp"/>
    </definition>

</tiles-definitions>
@Controller
public class Controller {

    @RequestMapping(value = "/main")
    public String getForm() {
        return "main";//tiles definition
    }

    @RequestMapping(value = "/customForm1")
    public  String getCustomForm(){
     return "section1"; // tiles definition
    }

    @RequestMapping(value = "/customForm2")
    public  String getCustomForm(){
     return "section2";
    }
}
in //tiles-layout.xml,&  put contents of the placeholder

    <definition name="newSection" extends="baseFrom">
             <put-attribute name="content" value="/WEB-INF/views/sections/newSectionForm.jsp"/>
        </definition>
@RequestMapping(value = "/{controller}/customForm")
public String getCustomForm(@PathVariable String controller) {
    String returnValue = null;
    if (controller.equals("myController")) {
        returnValue = "MyCustomForm";
    } else if (controller.equals("MyCustomForm2")) {
        returnValue = "MyCustomForm2";
    }
    return returnValue;
}