web概述
1.出现web程序开发的原因:
随着网络技术的不断发展,单机的软件程序已经很难满足网络计算的需要。为此,产生了各种网络程序开发体系结构。最重要的是C/S, B/S.
2.C/S:
客户端/服务端结构,client/server。客户端需要安装专门的客户端软件。QQ 微信 LOL等
优点:有一部分代码写在客户端, 用户体验比较好,
减轻了服务器的负担。
缺点:维护成本高,服务器更新,客户端也要随着更新。 占用资源大。
B/S:
浏览器/服务器结构,brower/sever。通过web浏览器向web服务器发送请求,由web服务器进行处理,并将处理结果返回给客户端浏览器。网页游戏 , WebQQ 等
优点:客户端只要有浏览器就可以了。 占用资源小, 不用更新。
开发和维护成本低
缺点:将事务处理逻辑部分交给服务器,增加了服务器的负担。用户体验不佳。
现在主流的网络应用程序开发体系结果首选B/S。
3.web应用程序的工作原理
静态网站:早期的web。web应用由静态页面构成,由html编写,放在web服务器上。用户使用浏览器通过HTTP协议请求服务器的资源,web服务器接收请求并作出处理,将结果返回给客户端浏览器,浏览器经过渲染后呈现给用户。
动态网站:随着网络的发展,线下的业务向网上发展,基于internet的web应用也越来越复杂,访问的不再只是静态页面,更多的内容需要根据用户的请求动态的生成页面信息,即动态网站。动态页面由html与动态脚本语言如:jsp等联合编写,并将编写好的程序部署到web服务器上,由服务器对动态脚本代码进行处理,并转化为浏览器可以解析的html代码,返回给浏览器,显示给用户。
tomcat
服务器
其实服务器就是一台电脑。 配置比一般的要好。
tomcat就是Apache基金会开发的服务器,免费并且跨平台。是学习java开发的比较实用的服务器。
Tomcat目录介绍
bin
> 包含了一些jar , bat文件 。 startup.bat、shutdown.bat。
conf tomcat的配置 server.xml 与web.xml
lib
tomcat运行所需的jar文件
logs
运行的日志文件
temp
临时文件
webapps
发布到tomcat服务器上的项目,就存放在这个目录。
work
jsp翻译成class文件存放地
如何把一个项目发布到tomcat中
需求: 如何能让其他的电脑访问我这台电脑上的资源 。 项目:test01
localhost : 本机地址
1. 拷贝这个项目到webapps/ROOT底下, 在浏览器里面访问:
http://localhost:8080/test01
http://localhost:8080 : 其实对应的是到webapps/root
2. 通过在server.xml文件中配置<Context>元素实现
在tomcat安装目录打开conf下打开server.xml文件,在<Host></Host>元素中间添加元素<Contex>元素。
-
在conf/server.xml 找到host元素节点。
-
加入以下内容。
<Context docBase="D:/
test01
" path="/a"></Context>
-
在浏览器地址栏上输入: http://localhost:8080/a即可访问到web应用的test01。
给Eclipse配置Tomcat
- 在server里面 右键新建一个服务器, 选择到apache分类, 找到对应的tomcat版本, 接着一步一步配置即可。
-
配置完毕后, 在server 里面, 右键刚才的服务器,然后open , 找到上面的Server Location , 选择中间的 Use Tomcat installation...
-
创建web工程, 在WebContent下定义html文件, 右键工程, run as server
HTTP:
通信双方按照这个超文本传输协议进行通信。
在http协议当中,规定了请求和响应双方, 客户端和服务器端。与web相关的资源。
有两种分类
-
静态资源
html 、 js、 css
-
动态资源
servlet/jsp
Servlet
- servlet是什么?
其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。
更多的是配合动态资源来做。 当然静态资源也需要使用到servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet
Severlet与ServletConfig与Serializable是三个接口。Severlet与ServletConfig定义了Servlet的基本方法以及封装了Servlet的配置信息。
GenericServlet是抽象类,实现了上面三个接口。但它没有对Http请求处理进行实现。
而HttpServlet实现了 GenericServlet,也对Http请求处理进行实现,为POST、GET方法等提供了具体的操作方法,所以通常我们编写的Servlet直接继承于HttpServlet。
第一个Servlet如下:
1 import java.io.IOException; 2 import java.io.PrintWriter; 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 public class WelcomeServlet extends HttpServlet { 8 private static final long serialVersionUID = 27126L; 9 @Override 10 public void doGet(HttpServletRequest request,//处理Http的Get请求 11 HttpServletResponse response) 12 throws ServletException, IOException { 13 response.setContentType("text/html");//设置内容类型 14 PrintWriter writer = response.getWriter();//打印流 15 writer.print("<html><head></head>"//写给浏览器,让浏览器解析后显示给用户 16 + "<body>Welcome</body></html>"); 17 } 18 }
编写好Servlet后我们需要配置这个Servlet类,即告诉Web容器哪一个请求调用了哪一个Servlet对象,对Servlet起到一个注册的作用。在webContent/WEB-INF/web.xml里面写上以下内容:
1.声明Servlet。通过<servlet>标签:里面有<servlet-name>和<servlet-class>两个标签
2.映射Servlet。通过<servlet-mapping>:里面有<servlet-name>和<servlet-mapping>两个标签
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 version="3.0"> 6 7 <servlet> 8 <servlet-name>WelcomeServlet</servlet-name>//自定义名称 9 <servlet-class>app01c.WelcomeServlet</servlet-class>//Servlet完整路径 10 </servlet> 11 12 <servlet-mapping>//映射 13 <servlet-name>WelcomeServlet</servlet-name>//与上面的自定义名称要一样 14 <url-pattern>/welcome</url-pattern>//映射访问的URL 15 </servlet-mapping> 16 </web-app>
Servlet的生命周期
- 生命周期
从创建到销毁的一段时间
- 生命周期方法
从创建到销毁,所调用的那些方法。
-
init方法
在创建该servlet的实例时,就执行该方法。 一个servlet只会初始化一次, init方法只会执行一次 默认情况下是 : 初次访问该servlet,才会创建实例。
-
service方法
只要客户端来了一个请求,那么就执行这个方法了。 该方法可以被执行很多次。 一次请求,对应一次service方法的调用
-
destroy方法
servlet销毁的时候,就会执行该方法 1. 该项目从tomcat的里面移除。 2. 正常关闭tomcat就会执行 shutdown.bat
doGet 和 doPost不算生命周期方法,所谓的生命周期方法是指,从对象的创建到销毁一定会执行的方法, 但是这两个方法,不一定会执行。
让Servlet创建实例的时机提前。
-
默认情况下,只有在初次访问servlet的时候,才会执行init方法。 有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。
-
那么这个时候,初次访问,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。
-
在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2开始即可。
<servlet> <servlet-name>HelloServlet04</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet04</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
ServletConfig
Servlet的配置,通过这个对象,可以获取servlet在配置的时候一些信息
每个Servlet只有一个ServletConfig
当Servlet容器初始化时,Servlet容器会给Servlet的init()方法传入一个ServletConfig。而这个ServletConfig的封装可有部署描述符或者@WebServlet传给Servlet的配置信息。传入的每一条信息就叫一个初始参数。每个初始参数有key和value两个值。
常用方法:
//1. 得到servlet配置对象 专门用于在配置servlet的信息 ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name 的文本内容 String servletName = config.getServletName(); //2、。 可以获取具体的某一个参数。 String address = config.getInitParameter("address"); //3.获取所有的参数名称 Enumeration<String> names = config.getInitParameterNames(); //遍历取出所有的参数名称 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); }
//4.获取上下文环境ServletContext