Servlet的编写及部署

因为接触Java,一上来就直接用SpringBoot了,Servlet还没用过。最近有一个很小的功能,要对外提供http服务,感觉用SpringBoot有点浪费,因此想用用Servlet。

代码编写

如果是通过IDEA创建的项目,只需要创建一个JavaEE的Web Application项目就可以了,文件结构都给你自动生成了,运行也只需要点执行按钮即可。

继承HttpServlet类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Translate extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str = "Hello Wrold!";
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");

OpenCC openCC = new OpenCC();
String content = "我是一名软件工程师,我喜欢鼠标键盘和服务器";

PrintWriter writer = resp.getWriter();
writer.println(content);
writer.flush();
writer.close();
}
}

编写web.xml文件

该文件需要放到WEB-INF目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<servlet>

<servlet-name>opencc</servlet-name>
<servlet-class>Translate</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>opencc</servlet-name>
<url-pattern>/translate</url-pattern>
</servlet-mapping>

</web-app>

部署

编译类文件,放到tomcat下

因为这个tomcat我部署了多个应用,因此这里在webapps下面,我单独给该应用创建了一个opencc目录。

只需要放置2个文件即可,位置如下:

/usr/local/tomcat/webapps/opencc/opencc/WEB-INF/classes/Translate.class

/usr/local/tomcat/webapps/opencc/opencc/WEB-INF/web.xml

配置tomcat的server.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Service name="opencc">
<Connector port="10004" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8014" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="opencc" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps/opencc"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="opencc_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
<Context path="/opencc" docBase="opencc" reloadable="true"></Context>
</Host>
</Engine>
</Service>

注意事项

tomcat中server.xml的Context各项属性的说明

1
2
3
4
<Context path="" docBase="FileManager" reloadable="true">
</Context>
<Context path="/FileManager" docBase="FileManager" reloadable="true">
</Context>

第一个Context是为了ip+端口直接指向FileManger这个项目。
path代表的是URL入口,例如第一个代表localhost:8080,第二个则代表localhost:8080/FileManger。
docBase是物理路径,可以是绝对路径,也可以是相对Host标签中appBase的相对路径,而Host标签中appBase的默认值是webapps文件夹,所以这里的FileManger就代表webapps下的FileManager文件夹。
这里的path+docBase的配置就表示了ip+端口或者ip+端口+/项目名称都可以指向你的项目。
reloadable就告诉Tomcat需要监控WEB-INF中的class文件,如果有变化了,就需要重新加载。并且是重新加载整个项目的,包括web.xml等等。

参考文章

https://blog.csdn.net/xn6517/article/details/49516299