由于最近项目里面要求要使用freemarker技术来做展现层,所以在网上搜索了好多资料,基础知识是看了李刚原来写的那本《struts2权威指南》。一直想在网上找一个很基础的例子来入门,但是不知道是我的原因还是怎么的,找到的都不是很理想,而且网上基本上是一篇文章到处贴。所以郁闷之下,就自己慢慢摸索写出了一个入门的例子,可以作为自己的总结,也可以让更多的初学者快速入门。

闲话少述,看例子。

*****例子的整个目录结构如下图:

说明:1、struts-tags.tld文件是由struts2的jar中拷贝出来的。

2、工程全部使用utf-8编码。

关键的几个文件:

1、index.ftl:

  1. <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]/>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>freemarkerDemo</title>
  7. </head>
  8. <body>
  9. <@s.form action="users/users_login.action">
  10. ${"用户名"}:<@s.textfield name="username"/><br/>
  11. ${"密码"}:<@s.password name="password"/><br/>
  12. <@s.submit value="sign on"/>
  13. </@s.form>
  14. </body>
  15. </html>

2、profile.ftl:

  1. <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]/>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>freemarkerDemo</title>
  7. </head>
  8. <body>
  9. 姓名:${username}
  10. <br/>
  11. 密码:${password}
  12. <br/>
  13. 年龄:${userInfo.age}
  14. <br/>
  15. 登录时间:${userInfo.signinTime?string("yyyy-MM-dd HH:mm:ss")}
  16. <br/>
  17. QQ:${userInfo.qq}
  18. <br/>
  19. 地址:${userInfo.addr}
  20. <hr/>
  21. 我的书籍:
  22. <#list userInfo.books as book>
  23. ${book}&nbsp;
  24. </#list>
  25. </body>
  26. </html>

3、web.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <filter>
  7. <filter-name>struts2</filter-name>
  8. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  9. </filter>
  10. <filter-mapping>
  11. <filter-name>struts2</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>
  14. <servlet>
  15. <servlet-name>JspSupportServlet</servlet-name>
  16. <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
  17. <load-on-startup>1</load-on-startup>
  18. </servlet>
  19. <welcome-file-list>
  20. <welcome-file>index.jsp</welcome-file>
  21. </welcome-file-list>
  22. </web-app>

4、sturts.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.dtd">
  5. <struts>
  6. <constant name="struts.ui.theme" value="simple" />
  7. <package name="users" extends="struts-default" namespace="/users">
  8. <action name="users_*" class="com.pop.project.myftl.test.action.UserAction" method="{1}">
  9. <result name="index" type="freemarker">/WEB-INF/ftl/index.ftl</result>
  10. <result name="profile" type="freemarker">/WEB-INF/ftl/profile.ftl</result>
  11. </action>
  12. </package>
  13. </struts>

5、UserAction:

  1. package com.pop.project.myftl.test.action;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. import com.pop.project.myftl.test.bean.UserInfo;
  7. public class UserAction extends ActionSupport {
  8. private static final long serialVersionUID = 1L;
  9. private String username;
  10. private String password;
  11. private UserInfo userInfo;
  12. /**
  13. * 首页
  14. * @return
  15. */
  16. public String index() {
  17. return "index";
  18. }
  19. /**
  20. * 登录
  21. * @return
  22. */
  23. public String login()
  24. {
  25. userInfo = new UserInfo() ;
  26. userInfo.setAddr("shaanxi baoji") ;
  27. userInfo.setAge(25) ;
  28. userInfo.setSigninTime(new Date()) ;
  29. userInfo.setQq("77276575") ;
  30. List<String> books = new ArrayList<String>() ;
  31. books.add("Thinking in Java") ;
  32. books.add("禅意花园") ;
  33. books.add("敏捷编程") ;
  34. books.add("代码大全") ;
  35. userInfo.setBooks(books) ;
  36. return "profile" ;
  37. }
  38. // setters and getters
  39. public String getUsername() {
  40. return username;
  41. }
  42. public void setUsername(String username) {
  43. this.username = username;
  44. }
  45. public String getPassword() {
  46. return password;
  47. }
  48. public void setPassword(String password) {
  49. this.password = password;
  50. }
  51. public UserInfo getUserInfo() {
  52. return userInfo;
  53. }
  54. public void setUserInfo(UserInfo userInfo) {
  55. this.userInfo = userInfo;
  56. }
  57. }

UserInfo类是一个有几个属性的javabean,这里就不用列了。

自己跑一下例子慢慢来吧。

运行结果:

freemarker技术入门例子(结合struts2)的更多相关文章

  1. MINA经典入门例子----Time Server

    原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html 貌似java的IO.NIO的入门例子都有相关的Time Server Demo.本例 ...

  2. 一个简单的iBatis入门例子

    一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...

  3. JPA入门例子(采用JPA的hibernate实现版本) 转

    JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化 ...

  4. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  5. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  6. freemarker基本入门教程

    copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主 ...

  7. 《SaltStack技术入门与实践》—— Grains

    Grains 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 前几章我们已经了解SaltStack各个组件以及通过一个案例去熟悉它的各种应用,从这章开 ...

  8. 《SaltStack技术入门与实践》—— Peer

    Peer 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Peer组件是SaltStack中Minion向Master发布任务的一个组件,使用Peer ...

  9. 《SaltStack技术入门与实践》—— Renderer组件

    Renderer组件 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 前面我们已经提过使用Python语言编写state.sls文件.在SaltSta ...

随机推荐

  1. Educational Codeforces Round 79 (Rated for Div. 2) - D. Santa's Bot(数论)

    题意:有$n$个孩子,第$i$个孩子有$k[i]$件想要的礼物,第$j$个礼物为$a[i][j]$,现在随机挑一个孩子,从他想要的礼物里面随机挑一个,然后送给另一个孩子$($这个孩子可以和第一个孩子是 ...

  2. 洛谷 P1339 [USACO09OCT]热浪Heat Wave(最短路)

    嗯... 题目链接:https://www.luogu.org/problem/P1339 这道题是水的不能在水的裸最短路问题...这里用的dijkstra 但是自己进了一个坑—— 因为有些城市之间可 ...

  3. Fedora26同步仓库缓存失败问题实记

    虽然目前的linux已经能自动选择最快的源,但是官方提供的镜像列表仍然较少,速度虽有所提升但是整体依然较慢,阿里的源作为国内最快的源却没有被纳入官方提供的源中 国内常使用的源有阿里,中科大,清华,网易 ...

  4. centos610无桌面安装libreoffice缺失字体

    1.安装libreoffice 2.安装fontconfig yum -y install fontconfig 3.安装ttmkfdir yum -y install ttmkfdir 4.检查已有 ...

  5. 笔记-Python-module

    笔记-Python-module 1.      模块 关于模块: 每个模块都有自己的私有符号表,模块中所有的函数以它为全局符号表.因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量 ...

  6. PAT T1003 Universal Travel Sites

    网络流模板~ #include<bits/stdc++.h> using namespace std; ; const int inf=1e9; queue<int> q; i ...

  7. day1-2基本数据类型

    /*5种基本数据类型 1,Undefined var a; a = undefined Undefined派生自Null 2,Null(本质属于object,单独细分出来的) var a = null ...

  8. LUA拾翠

    一.函数 1.格式 optional_function_scope function function_name( argument1, argument2, argument3..., argume ...

  9. MPAndroidChart柱子上的文字的颜色dataSet.setValueTextColors

    版本:MPAndroidChart v3.1.0 这是个很强大的图表,不同的版本对应的API会不一样. 需求描述: 用了柱状图,但要实现这样的功能,通过不同的门店来区分不同的柱子的颜色,并且柱子上文字 ...

  10. Android。WebView加载UR请求使用Cookie储存User_Id记录用户是否登陆过

    1.WebView初始化的时候用倒如下代码: if (Build.VERSION.SDK_INT >= 21) { CookieManager.getInstance().setAcceptTh ...