什么是jsp?与servlet区别?request responds cookies session 整理与使用?controller与servlet的区别?

1、什么是servlet

Servlet(Servlet Applet): 是用JAVA编写的服务器端程序。

1、定义

狭义上:指java语言实现的一个接口
广义上:指任意一个实现了这个Servlet接口的类

2、作用

servlet由servlet容器管理,servlet容器也叫 servlet引擎,是servlet的运行环境,给发送的请求和响应之上提供网络服务
Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。Servlet 容器用来管理程序员编写的 Servlet 类。

通俗来讲servlet专门用来接收客户端的请求,专门接收客户端的请求数据,然后调用底层service处理数据并生成结果
浏览器http请求------》tomcat服务器-------》到达servlet-----》执行doget,dopost方法----》返回数据

这个过程主要有:
(1)客户端发送请求到服务器端
(2)服务器将请求信息发送至Servlet
(3)Servlet生成响应内容并将其传给服务器。
(4)服务器将响应返回给客户端。

一个Servlet就是Java编辑语言中的一个,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编辑模式型来访问的应用程序。虽然Servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器的应用程序

Servlet看起来像是通常的Java程序。Servlet导入特定的属于javaServlet API的包。因为是对象字节码,可动态地从网络加载,可以说Servlet对Server就如同Applet对Client一样,但是,由于Servlet运行Server中,它们并不需要一个图形用户界面。从这个角度看,Servlet也被称为FacelessObject(隐形的根类).

3、servlet里的三大作用域

   request(请求):它的作用范围是一次请求和响应,是三个作用域中最小的。
   session(会话):它的作用比request要大一点,一次会话过程中,它的作用域就一直存在,(默认是30分钟)
   servletcontext:它作用范围最大,作用于整个服务器中。(Application

4、Servlet的生命周期

1.客户端请求该Servlet;

2.加载Servlet类到内存;

3.实例化并调用init()方法初始化该Servlet;

4.service()(根据请求方法不同调用doGet()或者doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions();)

5.destroy()销毁。

6、Servlet调用图

在这里插入图片描述

7、service方法

servlet有5个方法,其中service是最重要的,也是我们接下来学习的重点。它的实现类也主要实现它来完成响应工作。
在这里插入图片描述

void service(ServletRequest var1, ServletResponse var2){}

service有两个参数,ServletRequest中带着请求的信息,例如一个学生管理系统你想删除学生,ServletRequest就会给你你想删除的学生的学号;ServletResponse中带着响应的信息,就像点击删除后你想告诉用户删除成功没。

其他四个方法中没有这两个参数,也就意味着它们无法与浏览器交互,只负责servlet中的一些初始化、get方法、销毁servlet等等。

所以在实现Servlet接口时其他方法不用管,只需要重写service方法来实现功能就好。
servlet执行详解

8、servlet ---- 简单案例

注解方式
在这里插入图片描述
XML方式
在这里插入图片描述

9、Spring MVC与servlet的关系 是什么?

SpringMVC是对servlet的封装

Servlet和DispatcherServlet的关系

1、Servlet与JSP一起为Web应用开发带来了巨大的贡献,后来出现的众多Java Web应用开发框架都是基于这两种技术的,更确切的说,都是基于Servlet技术的。

2、Springmvc的核心是一个DispatcherServlet,并且DispatcherServlet继承自 FrameworkServlet继承自HttpServletBean 继承自HttpServlet(也就是你说的servelt) 本质上是一样的东西。其实就是基于tomcat等这些web容器对我们的CS请求能做更多的事情,如校验,拦截(AOP思想),后期渲染等等,好让我们专注于业务的开发。
Servlet:性能最好,处理Http请求的标准。

SpringMVC:开发效率高(好多共性的东西都封装好了,是对Servlet的封装,核心的DispatcherServlet最终继承自HttpServlet)

这两者的关系,就如同MyBatis和JDBC,一个性能好,一个开发效率高,是对另一个的封装。

对比两个实现过程我们发现: 使用servlet的话需要每个请求都去在web.xml中配置一个servlet,并且在控制层创建一个Servlet,而且,每个Servlet只是完成了doGet、doPost方法,这就是大型的资源浪费啊。而SpringMVC中的DispatcherServlet他会拦截所有的请求,进一步去查找有没有合适的处理器,一个前端控制器就可以。
最大的优点是让service对象和dao对象也成了单点,当多个servlet都引用这个service的时候,对比ioc容器,springioc的优势就显现了。除了这个优点以外,减少配置是一个很大的优点,虽然减少配置对不了解的人很不友好时间长了会不理解,但对已经掌握servlet配置项的人来说确实是一种优化;还有我觉得重要的一点是切面编程,**servlet要想实现类似spring的切面只有通过filter过滤器,filter的粒度太大在编码集层面,往往不能满足细微的操作,对应的就是spring的inteceptor拦截器和aspect切面,都可以做单一细微的功能加持,**像声明式事务就是切面的优点的例证,要想用servlet达到类似的功能是很难的。当然spring本来就是基于单一的servlet封装扩展而来,servlet是jdk本身提供的,而spring是由Rod Johnson等大师扩展的。

SpringMVC框架与Servlet介绍
DispatcherServlet源码详解

2、什么是JSP

JSP是一种Java servlet【JSP 的本质就是一个servlet】,主要用于实现Java web应用程序的用户界面部分。
它和servelt 一样 可以提供 动态的HTML 响应。 不同的是 Servlet 以java代码为主,
JSP 以 html 为主 然后内嵌少量的java 代码。

现在没有人直接使用 Servlet 开发动态网站,大家都转向了 JSP 阵营。
但是 JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,HTML 代码还是以字符串的形式向外输出的。您看,JSP 只是在 Servlet 的基础上做了进一步封装。
JSP 代码可以调用 Servlet 类,程序员可以将部分功能在 Servlet 中实现,然后在 JSP 中调用即可。
总之,Servlet 是 JSP 的基础,Servlet 虽然不直接面向用户,但是它依然是 JSP 的后台支撑,想玩转 JSP,必须先玩转 Servlet。

JSP(Java Server Pages)是一种动态网页开发技术。JSP 文件就是在传统的 HTML 文件中插入 Java 代码和 JSP 标签,后缀名为.jsp。
JSP 与 PHP、ASP、ASP.NET 等语言类似,**都运行在服务端**。通常返回给客户端的就是一个 HTML 文件,因此只要有浏览器就能查看 JSP 页面。
JSP 使用 JSP 标签在 HTML 网页中插入 Java 代码,标签通常以<%开头,以%>结束。JSP 标签有多种功能,比如访问数据库和 JavaBean 组件等,还可以在不同的网页之间传递和共享信息。

JSP 是 Servlet 的扩展,我们可以在 JSP 中使用 Servlet 的所有功能。另外,JSP 还提供了一些其他功能,例如 EL 表达式、自定义标签等。

JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,以字符串的形式向外输出 HTML 代码。所以,JSP 只是在 Servlet 的基础上做了进一步封装。

JSP 通过表单获取用户输入的数据、访问数据库或其它数据源生成动态的 Web 内容。

JSP 具有以下特点:
JSP 具有 Servlet 的所有优点,例如 JSP 文件跨平台,即一次编写,处处运行。
JSP 比 CGI 性能更加优越,因为 JSP 可以直接在 HTML 中嵌入标签,而 CGI 需要单独引用 CGI 文件。
JSP 比 Servlet 更易于维护,JSP 将业务逻辑与网页设计分离,使其更加灵活。
使用 JSP,Web 开发人员可以更注重于网页设计,Java 开发人员可以更注重于逻辑处理。

3、Servlet与JSP异同点

在这里插入图片描述
JSP相对于Servlet的优点
1)易于维护
相对于 Servlet 来说,JSP 更易于管理。在 JSP 中,我们可以轻松地将业务逻辑与网页设计分开,而在 Servlet 技术中,它们是混合在一起的。
2)快速开发:无需重新编译和部署
JSP 页面被修改后,不需要重新编译和部署项目。而 Servlet 被修改后,需要重新编译和部署。
3)代码简洁
在 JSP 中,我们可以使用 EL、JSTL、自定义标签、隐式对象等,能够有效的减少代码。

1、tomcat响应jsp给客户端的原理

tomcat服务器与客户端是两个不同的程序,端口号也不一样,服务器响应请求之后发送数据到客户端只能通过response对象去处理。response对象是servlet中方法的参数。

服务器自动做了一些事情:
为每个jsp生成一个servlet(即生成xxx_jsp.java文件,并把java文件编译为字节码文件xxx_jsp.class).
在生成的servlet中会有一个response对象,默默的用response.getWriter().write(“html标签”)方法生成html标签。

2、九个内置对象

1.域对象(4个)

pageContext
request
session
application

//最小的域对象,仅限于当前页面
pageContext.setAttribute("name","李白");
//request域对象,使用范围限于转发之间的页面
request.setAttribute("name","韩信");
//session域对象,范围是一次会话,浏览器或服务器不关闭称为一次会话,该工程下的任何jsp页面都可以取到
session.setAttribute("name","孙尚香");
//application域对象,范围最大,只要服务器不关,那么存的值一直有效
application.setAttribute("name","马可波罗");

2.其它对象

response
out
page
exception
config

3、JSP发展史和mvc

JavaWeb发展史
只有servlet,如果响应动态资源,必须使用response.writer()去输出大量的标签
jsp出生和繁荣,完全依赖jsp,省略了servlet,优点:便于开发,缺点:耦合度高,代码非常不清晰
mvc模式,jsp和servlet共存,jsp中只有少量的java代码,主要还是用于页面展示,核心功能放在servlet中
MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

m:model 模型层,泛指service层,dao层和javaBean实体类
v:view 视图层,使用jsp展示数据
c:controller 控制层,使用servlet处理请求和响应

4、request responds session 整理与使用?

1、request

request这个对象不用事先宣告,就可以在JSP网页中使用,在转译为Servlet之后,它会转换为javax.servlet.http.HttpServletRequest型态的对象,HttpServletRequest对象是有关于客户端所发出的请求之对象,只要是有关于客户端请求的信息,都可以藉由它来取得,例如请求标头、请求方法、请求参数、使用者IP等等信息。
request的主要方法:
getParameterNames():取得客户端所发出的请求参数名称.
getParameter():可以让您指定请求参数名称,以取得对应的设定值.
getServerName():请求的服务器.
getProtocol():使用协议.
getMethod():请求方法.
getServerPort():请求端口号.
getContextPath():Context路径.
getServletPath(): Servlet路径.
getRequestURI():URI路径.
getQueryString():查询字符串.
getRemoteAddr():使用者主机IP.
getRemotePort():使用者使用端口号.
简单来说就是取值用的。

2、什么是HTTP协议

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器

当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?

实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示
在这里插入图片描述
我们的Request 有可能是经过了代理服务器,最后才到达Web服务器的。

过程如下图所示
在这里插入图片描述
代理服务器就是网络信息的中转站,有什么功能呢?

  1. 提高访问速度, 大多数的代理服务器都有缓存功能。

  2. 突破限制, 也就是FQ了

  3. 隐藏身份。

3、URL详解

URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下

schema://host[:port#]/path/.../[?query-string][#anchor]

scheme 指定低层使用的协议(例如:http, https, ftp)

host HTTP服务器的IP地址或者域名

port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080/

path 访问资源的路径

query-string 发送给http服务器的数据

anchor- 锚

URL 的一个例子

在这里插入图片描述

4、HTTP协议是无状态的

http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态.

5、打开一个网页需要浏览器发送很多次Request

  1. 当你在浏览器输入URL http://www.cnblogs.com 的时候,浏览器发送一个Request去获取 http://www.cnblogs.com 的html. 服务器把Response发送回给浏览器.

  2. 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如图片,CSS文件,JS文件。

[通过fiddler等抓包工具可以看到,请求资源文件往往是在访问html之后]
3. 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。

  1. 等所有的文件都下载成功后。 网页就被显示出来了。

6、HTTP消息的结构

先看Request 消息的结构, Request 消息分为3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之间有个空行, 结构如下图
请求方法
请求头
请求体

在这里插入图片描述
第一行中的Method表示请求方法,比如"POST",“GET”, Path-to-resoure表示请求的资源, Http/version-number 表示HTTP协议的版本号

当使用的是"GET" 方法的时候, body是为空的

比如我们打开博客园首页的request 如下

GET http://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com

抽象的东西,难以理解,老感觉是虚的, 所谓眼见为实, 实际见到的东西,我们才能理解和记忆。 我们今天用Fiddler,实际的看看Request和Response.
下面我们打开Fiddler 捕捉一个博客园登录的Request 然后分析下它的结构, 在Inspectors tab下以Raw的方式可以看到完整的Request的消息, 如下图

在这里插入图片描述
我们再看Response消息的结构, 和Request消息的结构基本一样。 同样也分为三部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之间也有个空行, 结构如下图
响应行
响应头
响应体

在这里插入图片描述
HTTP/version-number表示HTTP协议的版本号, status-code 和message 请看下节[状态代码]的详细解释.

我们用Fiddler 捕捉一个博客园首页的Response然后分析下它的结构, 在Inspectors tab下以Raw的方式可以看到完整的Response的消息, 如下图
在这里插入图片描述

7、Get和Post方法的区别

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
我们看看GET和POST的区别

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.

  2. POST方法是把提交的数据放在HTTP包的Body中.

  3. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

  4. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

  5. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

8、状态码

Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.

HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

1XX 提示信息 - 表示请求已被成功接收,继续处理

2XX 成功 - 表示请求已被成功接收,理解,接受

3XX 重定向 - 要完成请求必须进行更进一步的处理

4XX 客户端错误 - 请求有语法错误或请求无法实现

5XX 服务器端错误 - 服务器未能实现合法的请求

#HTTP协议学习# (一)request 和response 解析

5、controller与servlet的区别

1、controller不是Servlet

在这里插入图片描述

理解1:

你可以理解为,Spring MVC是基于servlet的,它有一个DispatherServlet,然后它负责处理请求,并且调用了你的controller。

打一个比方,web网站是应用程序么?你可以说浏览器是一个应用程序,而web网站是让浏览器这个应用程序作为基础,成为通用的应用的容器。

理解2:

框架之所以叫框架,就是方便我们开发吧,比如它提供了安全验证,文件上传,参数填充,还有就是解耦合。而且基于Spring易实现事务控制和AOP

有问springmvc和servlet的区别的么?就像是问秦琼和关公一样,一个是框架,一个是局部实现,不能这么问,可以问controller和servlet的区别。。controller的前端控制器DispatcherServlet最终是继承了HttpServlet的,只不过springmvc帮助你做好了url和method的映射了(注解实现),不需要你自己在web.xml一个servlet和一个method去配置了
在这里插入图片描述
在这里插入图片描述

2、DispatcherServlet由谁创建

在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明:      1、 Loggers   Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。      Java程序举例来说:      //建立Logger的一个实例,命名为“com.foo”      Logger logger = Logger.getLogger("com.foo");      //设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。      logger.setLevel(Level.INFO);      Logger barlogger = Logger.getLogger("com.foo.Bar");      //下面这个请求可用,因为WARN >= INFO      logger.warn("Low fuel level.");      //下面这个请求不可用,因为DEBUG < INFO      logger.debug("Starting search for nearest gas station.");      //命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此,下面这个请求可用,因为INFO >= INFO      barlogger.info("Located nearest gas station.");      //下面这个请求不可用,因为DEBUG < INFO      barlogger.debug("Exiting gas station search");      这里“是否可用”的意思是能否输出Logger信息。      在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例,这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息,便于管理。比如:      static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());      2、 Appenders   禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。      其语法表示为:      org.apache.log4j.ConsoleAppender(控制台),      org.apache.log4j.FileAppender(文件),   org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达定尺寸的时候产生一个新的文件),   org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意定的地方)      配置时使用方式为:      log4j.appender.appenderName = fully.qualified.name.of.appender.class      log4j.appender.appenderName.option1 = value1      …      log4j.appender.appenderName.option = valueN      这样就为日志的输出提供了相当大的便利。      3、 Layouts   有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式,如根据HTML样式、自由定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。      其语法表示为:      org.apache.log4j.HTMLLayout(以HTML表格形式布局),   org.apache.log4j.PatternLayout(可以灵活地定布局模式),   org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),   org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)      配置时使用方式为:      log4j.appender.appenderName.layout =    fully.qualified.name.of.layout.class   log4j.appender.appenderName.layout.option1 = value1   …   log4j.appender.appenderName.layout.option = valueN      以上是从原理方面说明Log4j的使用方法,在具体Java编程使用Log4j可以参照以下示例:      1、 建立Logger实例:   语法表示:public static Logger getLogger( String name)   实际使用:static Logger logger = Logger.getLogger  (ServerWithLog4j.class.getName ()) ;      2、 读取配置文件:   获得了Logger的实例之后,接下来将配置Log4j使用环境:   语法表示:   BasicConfigurator.configure():自动快速地使用缺省Log4j环境。   PropertyConfigurator.configure(String configFilename):读取使用Java的特性文件编写的配置文件。   DOMConfigurator.configure(String filename):读取XML形式的配置文件。   实际使用:PropertyConfigurator.configure("ServerWithLog4j.properties");      3、 插入日志信息   完成了以上连个步骤以后,下面就可以按日志的不同级别插入到你要记录日志的任何地方了。   语法表示:   Logger.debug(Object message);   Logger.info(Object message);   Logger.warn(Object message);   Logger.error(Object message);   实际使用:logger.info("ServerSocket before accept: " + server) 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用,具体如下:      1、 配置根Logger,其语法为:   log4j.rootLogger = [ level ] , appenderName, appenderName, …   这里levelLogger的优先级,appenderName是日志信息的输出地,可以同时定多个输出地。如:log4j.rootLogger= INFO,A1,A2      2、 配置日志信息输出目的地,其语法为:   log4j.appender.appenderName = fully.qualified.name.of.appender.class   可以定上面所述五个目的地中的一个。      3、 配置日志信息的格式,其语法为:   log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class   这里上面三个步骤是对前面Log4j组件说明的一个简化;下面给出一个具体配置例子,在程序中可以参照执行:   log4j.rootLogger=INFO,A1   log4j.appender.A1=org.apache.log4j.ConsoleAppender   log4j.appender.A1.layout=org.apache.log4j.PatternLayout   log4j.appender.A1.layout.ConversionPattern=   %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n   这里需要说明的就是日志信息格式中几个符号所代表的含义:   -X号: X信息输出时左对齐;   %p: 日志信息级别   %d{}: 日志信息产生时间   %c: 日志信息所在地(类名)   %m: 产生的日志具体信息   %n: 输出日志信息换行      根据上面的日志格式,某一个程序的输出结果如下:   0  INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUI

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月常新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值