java篇-(java使用内嵌Tomcat开发javaWeb项目-初级篇)

写在前面

本项目使用开发软件为idea,版本控制使用maven,同时支持kotlin

初始化项目

使用idea构建kotlin项目

这里点击file,选择new project,然后选择kotlin,输入右侧一些信息之后,选择next
在这里插入图片描述
然后选择与上面jdk一样的版本,点击finish
在这里插入图片描述

pom.xml文件如下

这里添加tomcat-embed-core依赖,同时添加java编译插件,让java文件拥有11的新特性

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>embed-tomcat-example</artifactId>
    <groupId>com.lhstack</groupId>
    <version>0.0.1</version>
    <packaging>jar</packaging>

    <name>embed-tomcat-example</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <kotlin.code.style>official</kotlin.code.style>
        <kotlin.compiler.jvmTarget>11</kotlin.compiler.jvmTarget>
        <tomcat.embed.version>9.0.31</tomcat.embed.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-test-junit</artifactId>
            <version>1.4.10</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>${tomcat.embed.version}</version>
        </dependency>

        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
            <version>1.4.10</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>mavenCentral</id>
            <url>https://repo1.maven.org/maven2/</url>
        </repository>
    </repositories>

    <build>
        <sourceDirectory>src/main/kotlin</sourceDirectory>
        <testSourceDirectory>src/test/kotlin</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <target>11</target>
                    <source>11</source>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>1.4.10</version>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>
        </plugins>
    </build>
</project>

启动tomcat服务

使用java语言

package com.lhstack.embed;

import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.Tomcat;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lhstack
 */
public class EmbedTomcatApplication {
    public static void main(String[] args) throws Exception {
        //tomcat监听端口
        int port = 8080;
//        //tomcat的baseDir,如果是内嵌的,不需要启动war包项目,可以不需要设置此参数,这里就说明一下,不做配置
//        String baseDir = System.getProperty("user.dir") + "/tomcat";
//        //这里tomcat需要读取baseDir下面的webapps目录,并不会自动创建,所以需要单独处理一下,如果不需要启动war包项目,可以不做配置
//        String webapps = baseDir + "/webapps";
//        //创建目录
//        File file = new File(webapps);
//        if(!file.exists()){
//            file.mkdirs();
//        }
        Tomcat tomcat = new Tomcat();
        //tomcat.setBaseDir();

        tomcat.setPort(port);
        //需要设置一下端口,不然无法访问
        tomcat.getConnector().setPort(port);

        //创建一个context
        tomcat.addContext("/", Thread.currentThread().getContextClassLoader().getResource("").getFile());

        //创建servlet,指向上面创建的context,通过contextPath判断
        Wrapper servlet = tomcat.addServlet("/", "HelloServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.getOutputStream().print("hello world");
            }
        });
        //添加映射
        servlet.addMapping("/");

        //启动tomcat
        tomcat.start();

    }
}

通过浏览器访问 localhost:8080
在这里插入图片描述

使用kotlin语言

package com.lhstack.embed

import org.apache.catalina.startup.Tomcat
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

fun main() {
    val port:Int = 8080
    val tomcat:Tomcat = Tomcat()
    tomcat.setPort(port)
    tomcat.connector.port = port
    tomcat.addContext("/",Thread.currentThread().contextClassLoader.getResource("")!!.path)
    val servlet = tomcat.addServlet("/", "HelloServlet", object : HttpServlet() {
        override fun doGet(req: HttpServletRequest?, resp: HttpServletResponse?) {
            resp!!.outputStream.print("hello world")
        }
    })
    servlet.addMapping("/")
    tomcat.start()
}

启动后访问 localhost:8080
在这里插入图片描述

添加过滤器

使用java语言

		...
		...
        //添加映射
        servlet.addMapping("/");

        String encoding = "UTF-8";

        //定义filter
        FilterDef filterDef = new FilterDef();
        filterDef.setFilterName("CharacterEncodingFilter");
        filterDef.setFilter((req, res, chain) -> {
            if(req instanceof HttpServletRequest){
                System.out.println("setting request character encoding");
                req.setCharacterEncoding(encoding);
            }
            if(res instanceof HttpServletResponse){
                System.out.println("setting response character encoding");
                res.setCharacterEncoding(encoding);
            }
            chain.doFilter(req,res);
        });

        //定义filter映射
        FilterMap filterMap = new FilterMap();
        filterMap.setFilterName("CharacterEncodingFilter");
        filterMap.addURLPattern("/*");

        //添加filter
        context.addFilterDef(filterDef);
        context.addFilterMap(filterMap);

        //启动tomcat
        tomcat.start();

    }
}

启动应用,查看浏览器和控制台
在这里插入图片描述
在这里插入图片描述

使用kotlin语言

	...
	...
    val encoding = "UTF-8"
    val filterDef = FilterDef()
    filterDef.filterName = "CharacterFilterEncoding"
    filterDef.filter = Filter { req, res, chain ->
        if(req is HttpServletRequest){
            println("setting request character encoding $encoding")
            req.characterEncoding = encoding
        }
        if(res is HttpServletResponse){
            println("setting response character encoding $encoding")
            res.characterEncoding = encoding
        }
        chain.doFilter(req,res)
    }

    val filterMap = FilterMap()

    filterMap.addURLPattern("/*")
    filterMap.filterName = "CharacterFilterEncoding"

    context.addFilterDef(filterDef)
    context.addFilterMap(filterMap)

    tomcat.start()
}

启动应用,查看浏览器和控制台
在这里插入图片描述
在这里插入图片描述

自定义sessionId生成器

使用java语言

		...
		...
        //创建一个context
        Context context = tomcat.addContext("/", Thread.currentThread().getContextClassLoader().getResource("").getFile());

        //添加context管理器 TODO
        StandardManager standardManager = new StandardManager();
        standardManager.setSessionIdGenerator(new SessionIdGeneratorBase() {
            @Override
            public String generateSessionId(String route) {
                return "lhstack-uuid->" + route + "->" + UUID.randomUUID().toString().replaceAll("-","");
            }
        });
        context.setManager(standardManager);
        
        ...
        ...

        //启动tomcat
        tomcat.start();

    }
}

启动项目,通过浏览器查看,session id
在这里插入图片描述

使用kotlin语言

	...
	...
    val context = tomcat.addContext("/", Thread.currentThread().contextClassLoader.getResource("")!!.path)
    ...
    ...
    //添加context关联器
    context.manager = StandardManager()

    context.manager.sessionIdGenerator = object:SessionIdGeneratorBase(){
        override fun generateSessionId(route: String?): String {
            return "lhstack->uuid->${UUID.randomUUID().toString().replace("-","")}"
        }
    }
    ...
    ...
    tomcat.start()
}

启动项目,通过浏览器查看,session id
在这里插入图片描述

添加模板引擎的支持

添加thymeleaf支持

添加pom依赖

在pom.xml添加如下依赖

<dependency>
   <groupId>org.thymeleaf</groupId>
   <artifactId>thymeleaf</artifactId>
   <version>${thymeleaf.version}</version>
</dependency>

在这里插入图片描述

添加thymeleaf支持的Servlet

使用java语言
		...
		//这里修改之前第一个创建的servlet,选择转发的方式
		//创建一个context
        Context context = tomcat.addContext("/", Thread.currentThread().getContextClassLoader().getResource("").getFile());

        //创建servlet,指向上面创建的context,通过contextPath判断
        Wrapper servlet = tomcat.addServlet("/", "HelloServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //修改之前的输出,这里为了测试模板引擎的功能,所以选择转发
                req.getRequestDispatcher("index.html").forward(req,resp);
            }
        });
        //添加映射
        servlet.addMapping("/");
        ...

添加创建thymeleaf servlet的静态方法

public static void addThymeleafServlet(Context context,Tomcat tomcat){
		//这里context上下文,thymeleaf会去加载context的docBase目录下面的资源,所以之前我在创建context时,添加了当前classpath路径作为docBase路径
        ServletContext servletContext = context.getServletContext();
        ServletContextTemplateResolver contextTemplateResolver = new ServletContextTemplateResolver(servletContext);
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.addTemplateResolver(contextTemplateResolver);
        Tomcat.addServlet(context, "ThymeleafServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                DispatcherType dispatcherType = req.getDispatcherType();
                resp.setContentType("text/html;charset=utf-8");
                try{
                    String html = null;
                    if(dispatcherType == DispatcherType.FORWARD){
                        //如果是forward,就转发到受保护的template目录下面
                        html = templateEngine.process("/template" + req.getRequestURI(),new WebContext(req,resp,servletContext));
                    }else if(dispatcherType == DispatcherType.REQUEST){
                        //如果是普通请求,就映射static目录
                        html = templateEngine.process("/static" + req.getRequestURI(),new WebContext(req,resp,servletContext));
                    }
                    resp.getOutputStream().print(html);
                }catch (Exception e){
                    resp.getOutputStream().print("404 not found");
                }
            }
        }).addMapping("*.html");
    }

调用添加thymeleafServlet的方法

		...
		//添加filter
        context.addFilterDef(filterDef);
        context.addFilterMap(filterMap);
		//这里调用添加thymeleafServlet的方法
        addThymeleafServlet(context,tomcat);

        //启动tomcat
        tomcat.start();

在对应目录添加html文件
resources/static
在这里插入图片描述
resources/template
在这里插入图片描述

通过浏览器测试
访问静态路径
在这里插入图片描述
访问根路径,通过HelloServlet进行转发
在这里插入图片描述

使用Kotlin语言
	...
	val context = tomcat.addContext("/", Thread.currentThread().contextClassLoader.getResource("")!!.path)
    val servlet = tomcat.addServlet("/", "HelloServlet", object : HttpServlet() {
        override fun doGet(req: HttpServletRequest?, resp: HttpServletResponse?) {
            //修改之前的输出,这里为了测试模板引擎的功能,所以选择转发
            req!!.getRequestDispatcher("index.html").forward(req,resp)
        }
    })
    ...

添加addThymeleafServlet函数

fun addThymeleafServlet(context: Context){
    val servletContextTemplateResolver = ServletContextTemplateResolver(context.servletContext)
    val templateEngine = TemplateEngine()
    templateEngine.addTemplateResolver(servletContextTemplateResolver)
    Tomcat.addServlet(context,"ThymeleafServlet",object:HttpServlet(){
        override fun doGet(req: HttpServletRequest?, resp: HttpServletResponse?) {
            val dispatcherType = req!!.dispatcherType
            resp!!.contentType = "text/html;charset=utf-8"
            try {
                var html: String? = null
                if (dispatcherType == DispatcherType.FORWARD) {
                    //如果是forward,就转发到受保护的template目录下面
                    html = templateEngine.process("/template" + req.requestURI, WebContext(req, resp, servletContext))
                } else if (dispatcherType == DispatcherType.REQUEST) {
                    //如果是普通请求,就映射static目录
                    html = templateEngine.process("/static" + req.requestURI, WebContext(req, resp, servletContext))
                }
                resp.outputStream.print(html)
            } catch (e: Exception) {
                resp.outputStream.print("404 not found")
            }
        }
    }).addMapping("*.html")
    
}

调用添加thymeleafServlet的函数

	...
  	context.addFilterDef(filterDef)
    context.addFilterMap(filterMap)
    
    addThymeleafServlet(context)

    tomcat.start()
    ...

通过浏览器测试
访问静态路径
在这里插入图片描述
访问根路径,通过HelloServlet进行转发
在这里插入图片描述

使用freemarker

添加pom依赖

在pom.xml里面添加freemarker依赖
在这里插入图片描述

<dependency>
   <groupId>org.freemarker</groupId>
   <artifactId>freemarker</artifactId>
   <version>${freemarker.version}</version>
</dependency>

添加FreemarkerServlet,并在启动类里面使用

使用java语言

1.创建用于渲染freemarker模板的servlet
在这里插入图片描述

package com.lhstack.embed.servlet;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateNotFoundException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * @author lhstack
 */
public class FreemarkerServlet extends HttpServlet {

    private Configuration configuration = null;

    @Override
    public void init(ServletConfig config) throws ServletException {
        configuration = new Configuration(Configuration.VERSION_2_3_31);
        configuration.setClassLoaderForTemplateLoading(config.getServletContext().getClassLoader(),"");
        configuration.setEncoding(Locale.CHINA,"UTF-8");
        configuration.setDefaultEncoding("UTF-8");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doRender(req,resp);
    }

    /**
     * 统一渲染方法
     * @param req
     * @param resp
     */
    private void doRender(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //创建用于模板引擎中使用的变量
        Map<String,Object> model = new HashMap<>(4);
        model.put("Request",req);
        model.put("Response",resp);
        model.put("Session",req.getSession());
        model.put("Context",req.getServletContext());
        resp.setContentType("text/html;charset=utf-8");
        try{
            Template template = configuration.getTemplate("template" + req.getRequestURI().replaceAll(".html","ftl"));
            template.process(model,resp.getWriter());
        }catch (Exception e){
            if(e instanceof TemplateNotFoundException){
                resp.getOutputStream().print("template not found");
            }else{
                resp.getOutputStream().print(e.getMessage());
            }
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doRender(req,resp);
    }
}

2.使用FreemarkServlet
在启动类里面,添加freemarkerServlet

  		...
  		//添加filter
        context.addFilterDef(filterDef);
        context.addFilterMap(filterMap);
		//这里注释调thymeleafServlet
        //addThymeleafServlet(context,tomcat);
        addFreemarkerServlet(context,tomcat);
        //启动tomcat
        tomcat.start();
        ...

3.addFreemarkerServlet方法

public static void addFreemarkerServlet(Context context,Tomcat tomcat){
        Wrapper servlet = Tomcat.addServlet(context, "FreemarkerServlet", new FreemarkerServlet());
        servlet.addMapping("*.html");
    }

4.创建对应的ftl模板文件
在这里插入图片描述

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
this is freemarker page ${Request.getRequestURI()}
</body>
</html>

5.启动项目,通过浏览器访问
在这里插入图片描述

使用kotlin语言

1.使用FreemarkServlet
在启动类里面添加刚刚创建的FreemarkerServlet.java

...
    filterMap.addURLPattern("/*")
    filterMap.filterName = "CharacterFilterEncoding"

    context.addFilterDef(filterDef)
    context.addFilterMap(filterMap)

    //addThymeleafServlet(context)

    addFreemarkerServlet(context)

    tomcat.start()
}
//这里是函数
fun addFreemarkerServlet(context:Context){
    val servlet = Tomcat.addServlet(context, "FreemarkerServlet", FreemarkerServlet())
    servlet.addMapping("*.html")
}
...

2.启动项目,通过浏览器访问
在这里插入图片描述
在这里插入图片描述

完整代码

java语言

FreemarkerServlet.java

package com.lhstack.embed.servlet;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateNotFoundException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * @author lhstack
 */
public class FreemarkerServlet extends HttpServlet {

    private Configuration configuration = null;

    @Override
    public void init(ServletConfig config) throws ServletException {
        configuration = new Configuration(Configuration.VERSION_2_3_31);
        configuration.setClassLoaderForTemplateLoading(config.getServletContext().getClassLoader(),"");
        configuration.setEncoding(Locale.CHINA,"UTF-8");
        configuration.setDefaultEncoding("UTF-8");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doRender(req,resp);
    }

    /**
     * 统一渲染方法
     * @param req
     * @param resp
     */
    private void doRender(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //创建用于模板引擎中使用的变量
        Map<String,Object> model = new HashMap<>(4);
        model.put("Request",req);
        model.put("Response",resp);
        model.put("Session",req.getSession());
        model.put("Context",req.getServletContext());
        resp.setContentType("text/html;charset=utf-8");
        try{
            Template template = configuration.getTemplate("template" + req.getRequestURI().replaceAll(".html",".ftl"));
            template.process(model,resp.getWriter());
        }catch (Exception e){
            if(e instanceof TemplateNotFoundException){
                resp.getOutputStream().print("template not found");
            }else{
                resp.getOutputStream().print(e.getMessage());
            }
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doRender(req,resp);
    }
}

EmbedTomcatApplication.java

package com.lhstack.embed;

import com.lhstack.embed.servlet.FreemarkerServlet;
import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lhstack
 */
public class EmbedTomcatApplication {
    public static void main(String[] args) throws Exception {
        //tomcat监听端口
        int port = 8080;
//        //tomcat的baseDir,如果是内嵌的,不需要启动war包项目,可以不需要设置此参数,这里就说明一下,不做配置
//        String baseDir = System.getProperty("user.dir") + "/tomcat";
//        //这里tomcat需要读取baseDir下面的webapps目录,并不会自动创建,所以需要单独处理一下,如果不需要启动war包项目,可以不做配置
//        String webapps = baseDir + "/webapps";
//        //创建目录
//        File file = new File(webapps);
//        if(!file.exists()){
//            file.mkdirs();
//        }
        Tomcat tomcat = new Tomcat();
        //tomcat.setBaseDir();

        tomcat.setPort(port);
        //需要设置一下端口,不然无法访问
        tomcat.getConnector().setPort(port);

        //创建一个context
        Context context = tomcat.addContext("/", Thread.currentThread().getContextClassLoader().getResource("").getFile());

        //创建servlet,指向上面创建的context,通过contextPath判断
        Wrapper servlet = tomcat.addServlet("/", "HelloServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //修改之前的输出,这里为了测试模板引擎的功能,所以选择转发
                req.getRequestDispatcher("index.html").forward(req,resp);
            }
        });
        //添加映射
        servlet.addMapping("/");

        String encoding = "UTF-8";

        //定义filter
        FilterDef filterDef = new FilterDef();
        filterDef.setFilterName("CharacterEncodingFilter");
        filterDef.setFilter((req, res, chain) -> {

            if(req instanceof HttpServletRequest){
                System.out.println("setting request character encoding");
                req.setCharacterEncoding(encoding);
            }
            if(res instanceof HttpServletResponse){
                System.out.println("setting response character encoding");
                res.setCharacterEncoding(encoding);
            }
            chain.doFilter(req,res);
        });

        //定义filter映射
        FilterMap filterMap = new FilterMap();
        filterMap.setFilterName("CharacterEncodingFilter");
        filterMap.addURLPattern("/*");

        //添加filter
        context.addFilterDef(filterDef);
        context.addFilterMap(filterMap);

        //addThymeleafServlet(context,tomcat);
        addFreemarkerServlet(context,tomcat);
        //启动tomcat
        tomcat.start();

    }

    public static void addFreemarkerServlet(Context context,Tomcat tomcat){
        Wrapper servlet = Tomcat.addServlet(context, "FreemarkerServlet", new FreemarkerServlet());
        servlet.addMapping("*.html");
    }

    public static void addThymeleafServlet(Context context,Tomcat tomcat){
        //这里context上下文,thymeleaf会去加载context的docBase目录下面的资源,所以之前我在创建context时,添加了当前classpath路径作为docBase路径
        ServletContext servletContext = context.getServletContext();
        ServletContextTemplateResolver contextTemplateResolver = new ServletContextTemplateResolver(servletContext);
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.addTemplateResolver(contextTemplateResolver);
        Tomcat.addServlet(context, "ThymeleafServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                DispatcherType dispatcherType = req.getDispatcherType();
                resp.setContentType("text/html;charset=utf-8");
                try{
                    String html = null;
                    if(dispatcherType == DispatcherType.FORWARD){
                        //如果是forward,就转发到受保护的template目录下面
                        html = templateEngine.process("/template" + req.getRequestURI(),new WebContext(req,resp,servletContext));
                    }else if(dispatcherType == DispatcherType.REQUEST){
                        //如果是普通请求,就映射static目录
                        html = templateEngine.process("/static" + req.getRequestURI(),new WebContext(req,resp,servletContext));
                    }
                    resp.getOutputStream().print(html);
                }catch (Exception e){
                    resp.getOutputStream().print("404 not found");
                }
            }
        }).addMapping("*.html");
    }
}

kotlin语言

package com.lhstack.embed

import com.lhstack.embed.servlet.FreemarkerServlet
import org.apache.catalina.Context
import org.apache.catalina.session.StandardManager
import org.apache.catalina.startup.Tomcat
import org.apache.catalina.util.SessionIdGeneratorBase
import org.apache.tomcat.util.descriptor.web.FilterDef
import org.apache.tomcat.util.descriptor.web.FilterMap
import org.thymeleaf.TemplateEngine
import org.thymeleaf.context.WebContext
import org.thymeleaf.templateresolver.ServletContextTemplateResolver
import java.lang.Exception
import java.util.*
import javax.servlet.DispatcherType
import javax.servlet.Filter
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

fun main() {
    val port:Int = 8080
    val tomcat:Tomcat = Tomcat()
    tomcat.setPort(port)
    tomcat.connector.port = port
    val context = tomcat.addContext("/", Thread.currentThread().contextClassLoader.getResource("")!!.path)
    val servlet = tomcat.addServlet("/", "HelloServlet", object : HttpServlet() {
        override fun doGet(req: HttpServletRequest?, resp: HttpServletResponse?) {
            //修改之前的输出,这里为了测试模板引擎的功能,所以选择转发
            req!!.getRequestDispatcher("index.html").forward(req,resp)
        }
    })
    servlet.addMapping("/")

    //添加context关联器
    context.manager = StandardManager()

    context.manager.sessionIdGenerator = object:SessionIdGeneratorBase(){
        override fun generateSessionId(route: String?): String {
            return "lhstack->uuid->${UUID.randomUUID().toString().replace("-","")}"
        }
    }

    val encoding = "UTF-8"

    val filterDef = FilterDef()
    filterDef.filterName = "CharacterFilterEncoding"
    filterDef.filter = Filter { req, res, chain ->
        if(req is HttpServletRequest){
            println("setting request character encoding $encoding")
            req.characterEncoding = encoding
        }
        if(res is HttpServletResponse){
            println("setting response character encoding $encoding")
            res.characterEncoding = encoding
        }
        chain.doFilter(req,res)
    }

    val filterMap = FilterMap()

    filterMap.addURLPattern("/*")
    filterMap.filterName = "CharacterFilterEncoding"

    context.addFilterDef(filterDef)
    context.addFilterMap(filterMap)

    //addThymeleafServlet(context)

    addFreemarkerServlet(context)

    tomcat.start()
}

fun addFreemarkerServlet(context:Context){
    val servlet = Tomcat.addServlet(context, "FreemarkerServlet", FreemarkerServlet())
    servlet.addMapping("*.html")
}

fun addThymeleafServlet(context: Context){
    val servletContextTemplateResolver = ServletContextTemplateResolver(context.servletContext)
    val templateEngine = TemplateEngine()
    templateEngine.addTemplateResolver(servletContextTemplateResolver)
    Tomcat.addServlet(context,"ThymeleafServlet",object:HttpServlet(){
        override fun doGet(req: HttpServletRequest?, resp: HttpServletResponse?) {
            val dispatcherType = req!!.dispatcherType
            resp!!.contentType = "text/html;charset=utf-8"
            try {
                var html: String? = null
                if (dispatcherType == DispatcherType.FORWARD) {
                    //如果是forward,就转发到受保护的template目录下面
                    html = templateEngine.process("/template" + req.requestURI, WebContext(req, resp, servletContext))
                } else if (dispatcherType == DispatcherType.REQUEST) {
                    //如果是普通请求,就映射static目录
                    html = templateEngine.process("/static" + req.requestURI, WebContext(req, resp, servletContext))
                }
                resp.outputStream.print(html)
            } catch (e: Exception) {
                resp.outputStream.print("404 not found")
            }
        }
    }).addMapping("*.html")

}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值