Java33tomcat&servlet:nginx,web.xml,生命周期,适配器优化
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java33tomcat&servlet:nginx,web.xml,生命周期,适配器优化相关的知识,希望对你有一定的参考价值。
文章目录
1.nginx:.conf文件
以前网络编程中B/S架构中服务器是用socket写,用文件输入流读一个文件,读到后socket通过outputstream写出去,这些过程有了nginx后再也不用写了。nginx软件链接:https://pan.baidu.com/s/1zvF2irI6OenDKVfvSIOZmg ,提取码:gsn9。
如果http协议是80端口的话,80端口会被隐藏,本机浏览器输入http://localhost:80启动服务端
显示如下,hello nginx是E\\my81\\index.html里内容。本机ipconfig显示192.168.33.71。上面红框浏览器
(客户端)是别人的电脑【局域网下同一网段】,上面黑框步骤
就是服务器配置,浏览器和服务器三要素对应。
2.服务器:软件为tomcat/nginx,程序为servlet
Web(World Wide Web)即全球广域网,也称为万维网。
nginx不支持java规范,tomcat支持。tomcat8:https://tomcat.apache.org/download-80.cgi。免安装,解压即可用,链接:https://pan.baidu.com/s/1UJM9kbIHGIXkNXlYLpcoGw ,提取码:g610。dos系统识别文件后缀名不能超过3位(先有dos后有windows),所以.htm。8080一般是用来连接代理的(8080不能省,只有80才能省)。 只有index.html是默认的,不用加在最后:localhost:8080/a.html。
如下apache-tomcat8…是前面tomcat软件解压路径。如下不需要自己开启tomcat,idea配置自动开启。
如下New和上面一样,关联tomcat软件解压路径。
如下将web文件夹当成前端static web项目,web文件夹里都可以访问,除了web-info无法访问(如【mysql3】最后一节,-info文件夹放jar包),Toolbar工具栏。
如下点乌龟运行后,浏览器自动打开的原理。改变路径 / 写法。
如上若还是不会默认打开谷歌,需要File - Settings - Tools - Web Browsers
3.servlet:多态,web.xml
如下选中src右击new - java class,name为com.itheima01.servlet.MyServlet,还有一件事配置web.xml如上图所示。
package com.itheima01.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet { //javax.servlet.Servlet (x指extend,如果没有提示,则上面tomcat项目配置失败) //没有main函数,右击run不了,点乌龟
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("控制台日志: 服务器被访问了");
servletResponse.getWriter().print("hello servlet"); //在网页上打印(英文,中文会乱码)
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
如下点击idea中乌龟,自动打开网页,改变/my路径。
tomcat+servlet原理(4步):以前解析xml文件(web.xml)用dom4j,将xml先读到内存里在进行解析。第4步
:mapping映射后,tomcat(中介即代理默认端口8080)底层会进行反射,当前类com.itheima01.servlet.MyServlet肯定是Servlet接口的implements实现类,可以向上转型,父类Servlet调用方法执行子类重新的方法。
为什么tomcat底层用反射?tomcat底层设计不能和MyServlet耦合,只有全限定名和MyServlet有关(自己设定的),通用性。tomcat像管家中介(用户,tomcat软件【中介】,jdk的Servlet)在第3步等客人,第4步客人来了找my,tomcat根据客人请求找到my的住址com....MyServlet
,把my叫醒进行service办公。
如上在web.xml中,MyServlet01可以随便命名但要上下一致,my是资源位置,/my(因为在当前项目,http…8080可以省略,url)和com…MyServlet(class,全限定名
就是全类名
就是包名加类名
)对应关系。
4.servlet生命周期:LifecycleServlet
package com.itheima02.life;
import javax.servlet.*;
import java.io.IOException;
public class LifecycleServlet implements Servlet {
public LifecycleServlet(){ //不写也可以,一个类默认有 空参构造
System.out.println("LifecycleServlet");
}
//如下生命周期 5个重写
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
@Override
public void destroy() {
System.out.println("destroy");
}
//11111111111111111111111111111111111111111111111111111111以下没用
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
}
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>MyServlet01</servlet-name>
<servlet-class>com.itheima01.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet01</servlet-name>
<!-- <url-pattern>http://localhost:8080/my</url-pattern>-->
<url-pattern>/my</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LifecycleServlet</servlet-name>
<servlet-class>com.itheima02.life.LifecycleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LifecycleServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>GoodServlet</servlet-name>
<servlet-class>com.itheima03.good.GoodServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GoodServlet</servlet-name>
<url-pattern>/good</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>BetterServlet</servlet-name>
<servlet-class>com.itheima03.good.BetterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BetterServlet</servlet-name>
<url-pattern>/better</url-pattern>
</servlet-mapping>
</web-app>
如下默认调用空参构造创建实例。
5.servlet优化:GenericServelt/HttpServelt
只留一个接口叫适配器设计模式。将service方法根据不同请求方式分化出两个不同方法。
package com.itheima03.good;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GoodServlet extends GenericServlet {
//ServletRequest : 请求(前端发送服务器的数据), 兼容大部分协议(包括http), 子接口: HttpServletRequest
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //这个service方法将下面3个方法(service2,doPost,doGet)都调用了
System.out.println("goodServlet");
//没有ServletRequest.getgetMethod() //因为不是所有的协议都有请求方式,所以要向下转型
HttpServletRequest request = (HttpServletRequest) servletRequest; //协议: 必须是http
HttpServletResponse response = (HttpServletResponse) servletResponse;
// request.getMethod();
service2(request,response);
}
private void service2(HttpServletRequest request, HttpServletResponse response) {
String method = request.getMethod(); //请求方式
if("GET".equals(method)){
doGet(request,response);
}else if("POST".equals(method)){
doPost(request,response);
}
}
//以后再写Servlet只要继承GoodServlet(GoodServlet可以改名为HttpServlet),重写doPost和doGet就行
//如下相当于 http协议中post请求方式的 service方法,HttpServletRequest类比原ServletRequest类好用
private void doPost(HttpServletRequest request, HttpServletResponse response) {
}
//如下相当于 http协议中get请求方式的 service方法
private void doGet(HttpServletRequest request, HttpServletResponse response) {
}
}
浏览器:localhost:8080/good,网页无显示,控制台打印goodServlet。
package com.itheima03.good;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class BetterServlet extends HttpServlet { //sun公司已经封装HttpServlet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
如上解决了前二个问题。如下解决第三个问题,不用配置web.xml。
package com.itheima03.good;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/best")
public class BestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("被访问了");
}
}
如下把上面BestServlet类设置为模板,使用:选中包(包下)-new-servlet
如上模板如下:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet(urlPatterns = "/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
doGet(request,response);
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
}
以上是关于Java33tomcat&servlet:nginx,web.xml,生命周期,适配器优化的主要内容,如果未能解决你的问题,请参考以下文章
用于字节对齐读取的python ctypes pragma pack
SQLite pragma 命令中的 Android Studio 标记错误,<pragma value> 应为“ON”
嵌套循环中未正确忽略内部循环的 Pragma omp parallel
“pragma omp parallel for”中的“omp_get_num_threads”给了我编译错误