web(World Wide Web)即全球广域网,也称万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。
是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
javabweb就是使用Java语言进行WEB的开发
软件架构CS结构的软件
CS:Client/Server 客户端和服务器,这种软件往往需要安装。比如QQ、迅雷、播放器。
优点:可以减轻服务器端压力,将部分代码写到客户端;界面很美观。
缺点:一旦服务器更新了,客户端也需要更新。 分布式开发比较弱。
BS结构的软件
BS:Browser/Server 浏览器和服务器,这种软件不需要安装,只需要通过浏览器就可以访问。
优点:服务器一旦更新,不需要更新客户端,因为客户端就是浏览器;比较强的分布式能力
缺点:服务器端压力会比较大。 界面效果不如CS结构软件。
帮助我们把项目发布出去,可以通过浏览器访问。
-
硬件:其实就是一台电脑(这台电脑配置要求很高)。
-
软件:需要在这台电脑上安装web服务器的软件。
对于java来说,这属于企业级开发。
JAVAEE 企业级开发规范。
| 名字 | 企业 | 特点 |
|---|---|---|
| weblogic | oracle | 大型、收费、支持所有JAVAEE开发规范 |
| webshere | IBM | 大型、收费、支持所有JAVAEE开发规范 |
| tomcat | apache | 中小型、开源免费、支持所有JAVAEE开发规范(servlet jsp) |
| jboss | redhat | 中小型、开源免费、支持所有JAVAEE开发规范(EJB ) |
-
Tomcat:Apache组织提供的一个开源的免费的web服务器。满足EE的Servlet和JSP的规范。
-
WebSphere :IBM公司开发的一个收费的大型web服务器。满足了EE开发的所有规范。
-
WebLogic:BEA公司开发的一个收费的大型web服务器。满足了EE开发的所有规范。
-
Apache :应用在PHP平台上。
Tomcat是一个轻量级web的服务器,用来发布web项目。
Tomcat目录结构 webapps目录结构 tomcat内存溢出解决办法tomcat是目前应用十分广泛的一个Java servlet container与web服务器,但java.lang.OutOfMemoryError与java.lang.OutOfMemoryError: PermGen space的异常相信真正用过tomcat的人都遇到过(用户量大,应用使用频繁等),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。
linux下分配方法
编辑tomcat的catalina.sh文件,在第一行的后面增加一句:
JAVA_OPTS=‘-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M’
注意:单引号不能少,-server表示以server模式运行(运行效率比默认的client高很多,自己云去测试),
- -Xms256m是最小内存,
- -Xmx512m是最大内存,其中的256与512可根据你自己的内存做相应调整,
- PermSize/MaxPermSize最小/最大堆大小.一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置,我自己的文件如下:
#!/bin/sh JAVA_OPTS='-server -Xms1024m -Xmx1024m XX:PermSize=128M -XX:MaxPermSize=256M'
- 从应用方面
tomcat,一般是做动态解析才会用得到,支持jsp的解析,需要配置JDK支持;
nginx,则一般是做静态,本身不具备动态解析功能,需要配置其他插件或通过其他软件协同才具备动态功能,但nginx在静态上的功能非常强大,也可做访问控制,而且可以做成各种协议负载服务器,包括流媒体的也可以做,具体得去官方网站去看;
- 在性能方面
tomcat一般支持并发并不高100个差不多了
nginx在静态方面支持并发轻松达几万
- 总结:
两者应用领域不一样:tomcat是做java语言的动态解,而nginx则是一款功能强大的负载软件,配合各种插件可以实现各种功能.
Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件。
servlet入门小程序helloServlet com.itlx.servlet.HelloServlet helloServlet /hello
package com.itlx.servlet;
import javax.servlet.*;
import java.io.IOException;
// Servlet需要引入tomcat lib目录下的jar包
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.getWriter().write("hello servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
servlet执行流程
- 在浏览器中输入访问的地址
- (去配置文件中找路径)浏览器就会通过地址来访问项目,然后通过资源路径去找web.xml中的url-pattern标签与地址中的资源路径相匹配的。
- (匹配映射关系)通过url-pattern标签可以找到servlet-name标签,通过servlet-name又可以找到servlet-class,(找到要执行的servlet)这时就会自动调用servlet的service方法,(通过响应对象完成响应)
生命周期:servlet对象从创建到销毁的过程。
每个servlet在web项目中是单例,支持多线程操作。
// 初始化,当创建了servlet对象就会自动调用该方法。 init() // 服务方法,每当有请求访问的时候,都会调用该方法。 service() // 销毁,当正常关闭服务器的时候调用。 destroy()HttpServlet
HttpServlet实现了http协议。
HttpServlet继承GenericServlet(无关联协议的类,如果有别的协议可以继承这个类实现,但貌似现在实际上只有http协议),GenericServlet实现了Servlet。
request请求对象,封装了浏览器给服务器的请求信息(请求行,请求头,请求体)
// 获取请求参数的值 String getParameter(String name)response
响应对象,设置服务器给浏览器的响应信息(响应行,响应头,响应体)
// 向客户端写数据 getWriter().write()servletConfig
每个servlet都有自己的servletConfig,里面存放着servlet配置信息
// this代表当前servlet对象 // 获取当前servlet的配置信息对象 ServletConfig this.getServletConfig()demo
测试HttpServlet
web.xml
servletDemo com.lx.servlet.http.HttpServletDemo sid sid 1 servletDemo /servlet/form /servlet/form2
package com.lx.servlet.http;
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;
public class HttpServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是doGet请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是doPost请求");
// this代表当前servlet对象
// 获取当前servlet的配置信息对象
ServletConfig servletConfig = this.getServletConfig();
// 当前servlet的名字
String servletName = servletConfig.getServletName();
System.out.println(servletName);
// 获取servlet初始化参数
String namespace = servletConfig.getInitParameter("sid");
System.out.println(namespace);
// 解决post乱码
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + password);
// 设置响应头,通知浏览器编码形式
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(username + password);
}
}
servletContext
每个servlet都有自己的servletConfig,包含着servlet的配置信息,这个对象属于某一个servlet。
每个web项目,我们都当做一个对象看待,web项目可以理解成是一个容器,那么这个容器就代表着当前web项目。
这个容器我们称为ServletContext对象,代表web容器,ServletContext就代表web这块空间。一个web项目只有一个ServletContext对象。
web项目中有多个servlet,那么这个servletContext对象就是用来管理servlet。也叫servlet上下文对象。
- 可以实现servlet之间的通信。
- 可以获取当前web项目中的一些信息。
servletContext生命周期
-
创建:当服务器启动的时候,就会发布项目,一发布项目,就会为发布的web项目创建一个ServletContext对象。
-
销毁:服务器关闭的时候,或者从服务器中移除项目。
部分知识引用自:
https://www.cnblogs.com/xiaoquan-blog/p/12611851.html
https://blog.csdn.net/liangmengbk/article/details/99177782
https://www.jianshu.com/p/d8bd75c0fb1b
https://www.jianshu.com/p/332361db0dd7
https://www.jianshu.com/p/959e73761654?utm_campaign
只要有了活下去的理由,几乎什么都能够忍受。
尼采



