Solon详解系列文章:

Solon详解(一)- 快速入门

Solon详解(二)- Solon的核心

Solon详解(三)- Solon的web开发

Solon详解(四)- Solon的事务传播机制

Solon详解(五)- Solon扩展机制之Solon Plugin

Solon详解(六)- Solon的校验扩展框架使用与扩展

Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

Solon详解(八)- Solon的缓存框架使用和定制

Solon详解(九)- 渲染控制之定制统一的接口输出

Solon 开发 jsp 项目是非常简单的,只要改用 jetty 启动器 或者 undertow 启动器,其它也没特别之处了。此文用 undertow + jsp + tld 这个套路搞一把:

一、 开始Meven配置走起

用solon 做 undertow + jsp 的开发;只需要配置一下 meven 即可(不需要其它的额外处理或启用)

    <parent>
<groupId>org.noear</groupId>
<artifactId>solon-parent</artifactId>
<version>1.0.40</version>
</parent> <dependencies>
<!-- 添加 solon web 开发包 -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-web</artifactId>
<type>pom</type>
<exclusions>
<!-- 排除默认的 jlhttp 启动器 -->
<exclusion>
<groupId>org.noear</groupId>
<artifactId>solon.boot.jlhttp</artifactId>
</exclusion>
</exclusions>
</dependency> <!-- 添加 undertow 启动器 -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon.boot.undertow</artifactId>
</dependency> <!-- 添加 undertow jsp 扩展支持包 -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon.extend.undertow.jsp</artifactId>
</dependency> <!-- 添加 jsp 视图渲染器(可以添加一堆别的view插件) -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon.view.jsp</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.14.4</version>
<scope>provided</scope>
</dependency>
</dependencies>

二、 其它代码和平常开发就差不多了

//资源路径说明(不用配置)
resources/application.properties(或 application.yml) 为应用配置文件
resources/static/ 为静态文件根目标
resources/WEB-INF/view/ 为视图文件根目标(支持多视图共存) //调试模式:
启动参数添加:-deubg=1
  • 添加个控制器 src/main/java/webapp/controller/HelloworldController.java
@XController
public class HelloworldController { //这里注入个配置
@XInject("${custom.user}")
protected String user; @XMapping("/helloworld")
public ModelAndView helloworld(XContext ctx){
UserModel m = new UserModel();
m.setId(10);
m.setName("刘之西东");
m.setSex(1); ModelAndView vm = new ModelAndView("helloworld.jsp"); //如果是ftl模板,把后缀改为:.ftl 即可 vm.put("title","demo");
vm.put("message","hello world!"); vm.put("m",m); vm.put("user", user); vm.put("ctx",ctx); return vm;
}
}
  • 再搞个自定义标签 src/main/java/webapp/widget/FooterTag.java (对jsp来说,这个演示很重要)
public class FooterTag extends TagSupport {
@Override
public int doStartTag() throws JspException {
try {
String path = XContext.current().path(); //当前视图path
StringBuffer sb = new StringBuffer();
sb.append("<footer>");
sb.append("我是自定义标签,FooterTag;当前path=").append(path);
sb.append("</footer>");
pageContext.getOut().write(sb.toString());
}
catch (Exception e){
e.printStackTrace();
} return super.doStartTag();
} @Override
public int doEndTag() throws JspException {
return super.doEndTag();
}
}
  • 加tld描述文件 src/main/resources/WEB-INF/tags.tld (位置别乱改,就放这儿...)
<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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-jsptaglibrary_2_0.xsd" version="2.0"> <description>自定义标签库</description>
<tlib-version>1.1</tlib-version>
<short-name>ct</short-name>
<uri>/tags</uri> <tag>
<name>footer</name>
<tag-class>webapp.widget.FooterTag</tag-class>
<body-content>empty</body-content>
</tag> </taglib>
  • 视图 src/main/resources/WEB-INF/view/helloworld.jsp
<%@ page import="java.util.Random" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="ct" uri="/tags" %>
<html>
<head>
<title>${title}</title>
</head>
<body>
<div>
context path: ${ctx.path()}
</div>
<div>
properties: custom.user :${user}
</div>
<main>
${m.name} : ${message} (我想<a href="/jinjin.htm">静静</a>)
</main>
<ct:footer/>
</body>
</html>

三、 疑问

一路上没有web.xml ? 是的,没有。

四、 源码

源码:demo05.solon_mvc_undertow_jsp

最新文章

  1. PHP 高级编程(4/5) - SPL异常类之 LogicException 逻辑异常
  2. ThinkPHP框架下的表单验证
  3. Shuffling Machine和双向链表
  4. 使用新版Android Studio检测内存泄露和性能
  5. 转:strcmp函数实现及分析
  6. 附加题-stack的理解
  7. QT-opencv小结
  8. DZY Loves Colors
  9. Lowest Common Ancestor of a Binary Tree, with Parent Pointer
  10. JAVA - 工厂模式
  11. 【java提高】---HashMap解析(一)
  12. 20170723-Ioc与AOP
  13. 元组tuple插入字符串的方式
  14. 利用spring实现服务启动就自动执行某些操作的2种方式
  15. 10--Python入门--异常处理
  16. 静态分析Android程序
  17. Python进阶【第三篇】Python中的基本数据类型
  18. mysqldb mysql_config
  19. CentOS 6.5安装配置Nginx
  20. Halcon标定

热门文章

  1. 认识JavaScript中Let和Var的区别
  2. EXCEL 引用autocad vba,自动加载其类型库
  3. mock之初体验
  4. 常用API【2】
  5. 在 Windows 上安装 Composer
  6. Bootstrap4总结
  7. jackson序列化与反序列化的应用实践
  8. 逐浪CMS最新V8.1.6 Beta版安装部署操作
  9. [LeetCode]671. 二叉树中第二小的节点(递归)
  10. asp.net中的日志添加和未处理异常的记录