복붙노트

[SPRING] Spring MVC에서 정적 페이지 주소 지정을 처리하는 방법

SPRING

Spring MVC에서 정적 페이지 주소 지정을 처리하는 방법

Tile3을 사용하는 Spring MVC 애플리케이션이있다. 나는 tile3에 의해 현재 제공되고있는 웹 사이트의 템플릿에 그것들을 삽입 할 필요가있는 많은 정적 페이지를 가지고있다. 정적 페이지에 대한 주소 지정 방법은 동적이거나 정적 인 모든 페이지에서 동일한 바닥 글과 헤더를 사용해야합니다.

정적 페이지의 예는 index.jsp 및 aboutus.jsp입니다. 이 정적 페이지에 어떻게 액세스합니까? 컨트롤러를 통해해야합니까?

jsp : include를 사용할 수 있다는 것을 알고 있지만 이것이 좋은 습관입니까? 내가 타일을 사용하는 것처럼 어떤 대안도 없을까요? 이 튜토리얼에서는 별도의 컨트롤러를 제안했지만 최적의 솔루션인지는 확실하지 않습니다. 서버에 불필요한 요청을 보내는 것입니다.

타일보다 더 좋은 옵션이 있는지 알려주세요.

을 포함한다.

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


   <listener>
       <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
   </listener>
   <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>springapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/springapp-servlet.xml</param-value>
    </context-param>



</web-app>

tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
  "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
  "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>
    <definition name="baseLayout" template="/WEB-INF/templates/baseLayout.jsp">
        <put-attribute name="title" value="Title is here (Tile)"/>
           <put-attribute name="header" value="header.jsp"/>
              <put-attribute name="menu" value="Title is here (Tile)"/>
                 <put-attribute name="body" value="Title is here (Tile)"/>
                 <put-attribute name="footer" value="footer.jsp"/>

    </definition>

    <definition name="hello" extends="baseLayout">
        <put-attribute name="title" value="HELERE"/>
          <put-attribute name="body" value="/WEB-INF/pages/pages/ewfsdfsdf.jsp"/>
    </definition>

        <definition name="index" extends="baseLayout">
        <put-attribute name="title" value="HELERE"/>
          <put-attribute name="body" value="/WEB-INF/pages/index.jsp"/>
    </definition>
</tiles-definitions>

제어 장치

@Controller
public class HelloController {

    protected final Log logger = LogFactory.getLog(getClass());

    public HelloController() {
        System.err.println("Constructor of HelloController");
    }

    @RequestMapping("/index.htm")
    public String index(){
        System.err.println("in index method");
        return "index";
    }

baseLayout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><tiles:insertAttribute name="title"/></title>
</head>
<body>
      <div id="container">
         <tiles:insertAttribute name="header"/>
         <tiles:insertAttribute name="menu"/>
         <tiles:insertAttribute name="body"/>
         <tiles:insertAttribute name="footer"/>
      </div>
</body>
</html>

index.jsp

<p>

This is the body of index page

</p>

JSP 사용 : include

   pros
     - No extra load neither on DB nor on server
   cons
     - To backup need to backup all static files
     - Might have overwork as each page should be prepared separately rather than having a single template for all pages and just populate the template
     - If need to add something to static pages need to change all pages.

해결법

  1. ==============================

    1.난 그냥 그것을위한 좋은 해결책을 발견했다 정적 페이지를 우리가 사용할 수있는 서블릿에서, 샘플 코드는 여기와 여기, 타일뿐만 아니라 당신이 각 경로에 대한 정의를 가지고 있는지 확인 tiles.xml 파일에 있습니다.

    난 그냥 그것을위한 좋은 해결책을 발견했다 정적 페이지를 우리가 사용할 수있는 서블릿에서, 샘플 코드는 여기와 여기, 타일뿐만 아니라 당신이 각 경로에 대한 정의를 가지고 있는지 확인 tiles.xml 파일에 있습니다.

     <mvc:view-controller path="/index" />
     <mvc:view-controller path="/"  view-name="index"/>
    
  2. ==============================

    2.당신이 해낸 방법은 효과가 있지만 정적 페이지마다 새로운 Mapper 함수를 만드는 것은 좋은 생각이 아닙니다. 컨트롤러에서 할 수있는 일은 컨트롤러에 있습니다.

    당신이 해낸 방법은 효과가 있지만 정적 페이지마다 새로운 Mapper 함수를 만드는 것은 좋은 생각이 아닙니다. 컨트롤러에서 할 수있는 일은 컨트롤러에 있습니다.

    @RequestMapping("/page/{viewName}.htm")
    public String index(@PathVariable(value="viewName") String viewName, Model model){
        if(isValidView(viewName)){
            model.addAttribute("viewName", viewName);
            return "page";
        }
    
        return null;
    }
    

    그러나 viewName이 유효한지 확인해야합니다. 그렇지 않으면 보안 문제가됩니다.

    이 기사도 읽으십시오.

    편집하다

    isValidView 함수는 동일한 클래스 또는 BaseController 클래스 또는 서비스 호출을 통해 againts DB를 확인할 수 있습니다. 해당 파일을 확인하는 것은 좋은 생각이 아닙니다. 왜냐하면 자원이 필요하기 때문이 아니라 경로가 프로덕션 서버에서 다를 수 있기 때문입니다.

    정적 페이지 본문이 HTML 일 경우 DB에 내용을로드하고 수행 할 수 있습니다.

    <jsp:include page="/WEB-INF/pages/header.jsp"/>
    ${htmlContent}
    <jsp:include page="/WEB-INF/pages/footer.jsp"/>
    

    또는 당신이 몸을 역동적으로 유지하고 싶다면.

    tiles.xml에 대해

    <definition name="pageLayout" extends="baseLayout">
        <put-attribute name="title" value="HELERE"/>
          <put-attribute name="body" value="/WEB-INF/page.jpg"/>
    </definition>
    

    page.jsp에 대한

    <jsp:include page="/WEB-INF/pages/header.jsp"/>
    <jsp:include page="/WEB-INF/pages/page/${viewName}.jsp"/>
    <jsp:include page="/WEB-INF/pages/footer.jsp"/>
    
  3. ==============================

    3.baseLayout 페이지에서 모든 것을로드하고 더 높은 레벨을 생성 할 수 있습니다. 내 말은 다음과 같은 것입니다 :

    baseLayout 페이지에서 모든 것을로드하고 더 높은 레벨을 생성 할 수 있습니다. 내 말은 다음과 같은 것입니다 :