发表于: 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©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
评论