发表于: 2017-08-17 22:43:41

1 1140


今天做的事:

今天被tiles框架卡了一天,只能说自己学的不扎实导致的恶果。


首先是遇到问题,为什么使用Controller的get请求获取不到jsp页面

发现是在spring-servlet.xml配置文件少了一个配置

<mvc:annotation-driven/>

所以,就会报错

这个标签<mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。


然后就是配置配置tiles框架

先把我的代码都贴上

pom.xml

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
   <dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.17</version>
   </dependency>


   <!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-extras -->
   <dependency>
     <groupId>org.apache.tiles</groupId>
     <artifactId>tiles-extras</artifactId>
     <version>3.0.7</version>
   </dependency>


   <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
   <dependency>
     <groupId>commons-beanutils</groupId>
     <artifactId>commons-beanutils</artifactId>
     <version>1.8.0</version>
   </dependency>

   <!-- https://mvnrepository.com/artifact/commons-digester/commons-digester -->
   <dependency>
     <groupId>commons-digester</groupId>
     <artifactId>commons-digester</artifactId>
     <version>2.1</version>
   </dependency>

   <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
   <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-api</artifactId>
     <version>1.7.25</version>
   </dependency>

   <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
   <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
     <version>1.7.25</version>
     <scope>test</scope>
   </dependency>


   <dependency>
     <groupId>org.apache.tiles</groupId>
     <artifactId>tiles-api</artifactId>
     <version>3.0.7</version>
   </dependency>

   <dependency>
     <groupId>org.apache.tiles</groupId>
     <artifactId>tiles-core</artifactId>
     <version>3.0.7</version>
   </dependency>

   <!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-jsp -->
   <dependency>
     <groupId>org.apache.tiles</groupId>
     <artifactId>tiles-jsp</artifactId>
     <version>3.0.7</version>
   </dependency>

   <!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-servlet -->
   <dependency>
     <groupId>org.apache.tiles</groupId>
     <artifactId>tiles-servlet</artifactId>
     <version>3.0.7</version>
   </dependency>

   <dependency>
     <groupId>org.apache.tiles</groupId>
     <artifactId>tiles-template</artifactId>
     <version>3.0.7</version>
   </dependency>
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.2</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api

-->
   <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>javax.servlet.jsp-api</artifactId>
     <version>2.3.1</version>
   </dependency>
   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>2.5</version>
     <scope>provided</scope>
   </dependency>

剩下的是Spring的相关配置,不贴了


spring-servlet.xml新加入的两个解析器

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
   <property name="viewClass">
       <value>org.springframework.web.servlet.view.tiles3.TilesView</value>
   </property>
   <property name="order" value="1"/>
</bean>

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
   <property name="definitions">
       <list>
           <value>/WEB-INF/tiles.xml</value>
       </list>
   </property>
</bean>


web.xml中的东西没有需要新加入的


然后需要配置一个tiles的配置文件

tiles.xml

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

<tiles-definitions>
   <definition name="base.definition" template="/WEB-INF/jsp/layout.jsp">
       <put-attribute name="title" value=""/>
       <put-attribute name="header" value="/WEB-INF/jsp/header1.jsp"/>
       <put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp"/>
       <put-attribute name="body" value=""/>
       <put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp"/>
   </definition>

   <definition name="contacter" extends="base.definition"  >
       <put-attribute name="title" value="Contact Manager"/>


       <put-attribute name="body" value="/WEB-INF/jsp/contact.jsp"/>

   </definition>

</tiles-definitions>


最后把模板代码贴上

layout.jsp

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@page language="java" contentType="text/html;charset=utf-8"%>
<!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" ignore="true"/> </title>
</head>
<body>
<table border="1" cellpadding="2" cellspacing="2" align="center">
   <tr>
       <td height="30" colspan="2"><tiles:insertAttribute name="header"/> </td>
   </tr>
   <tr>
       <td height="250"><tiles:insertAttribute name="menu"/> </td>
       <td height="350"><tiles:insertAttribute name="body"/> </td>
   </tr>
   <tr>
       <td height="30" colspan="2"><tiles:insertAttribute name="footer"/></td>
   </tr>
</table>
</body>
</html>

其他的jsp页面都很简单

menu.jsp

<span style="font-size: 14px;"><p>Menu</p></span>

header1.jsp

<h1>Header</h1>

footer.jsp

<span style="font-size: 14px;"><p>CopyRight&copy;Zemo.com </p></span>

contact.jsp

<%@page language="java" contentType="text/html;charset=utf-8"%>
<html>
<body>
这个页面好像不太好写,就这样吧
</body>
</html>


最后是最关键的地方,也是我犯错卡了一天的地方

@Controller
public class aController {

@RequestMapping(value = "/contact", method = RequestMethod.GET)
public String getL() {

return "contacter";
   }

}


这里返回的是tiles布局定义里的name属性,而不是jsp页面名,并且把这个name属性交给新加入的两个解析器来解析,就会出来我们设计的tiles框架完整版

至此,tiles框架配置完成,之前由于我写的是return jsp页面名,报错如下

org.apache.tiles.template.NoSuchAttributeException: Attribute 'header' not found.


最后,自己还是之前对于这些地方了解的不够深入,才导致今天浪费了一天时间,也多亏及时问了师兄,不然不知道又要卡多久。


最最后,讲一下用到的那几个标签

<put-attribute

这个用来分布局区域,通过定义我们也可以看的出来

<tiles:insertAttribute

我的理解是用来引用定义的布局区域


还看到程远用到的一个标签

<tiles:insertDefinition

我觉得是用来直接引用布局的

果然如我所料

lay.jsp

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@page language="java" contentType="text/html;charset=utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<tiles:insertDefinition name="contacter"/>

</html>



加一个知识点:

把那些限制访问的资源(比如说jsp源代码)放到Web应用的WEB-INF目录下,对于/web-INF/及其子目录,不允许直接的公共访问,所以就可以起到保护这些代码未经授权的访问和窥视,更好的保护了源代码


基于Servlet的声明,WEB-INF不作为Web应用的公共文档树的一部分。因此,WEB-INF 目录下的资源不是为客户直接服务的。我们仍然可以使用WEB-INF目录下的JSP页面来提供视图给客户,客户却不能直接请求访问JSP

放到WEB-INF目录下的文件是不允许采用redirect方式的跳转来访问的,但是forward可以


明天计划:将tiles框架整合任务中;学习tag显示时间;部署服务器;完成任务四


问题:已解决


收获:tiles框架;启动Controller的标签

<mvc:annotation-driven/>


进度:开始时间:2017.08.12

    预计demo:2017.08.18

    是否有延期风险:延期一天,被tiles框架卡住了一天

    禅道链接:http://task.ptteng.com/zentao/project-task-285-unclosed.html



返回列表 返回列表
评论

    分享到