Servlet基础

Servlet 基础
 
一.概念及安装
 
1.什么是Servlet
  • 服务端的java程序
  • 必须实现javax.servlet.Servlet接口   标准
  • 没有main()方法,它的生命周期由容器来管理(Tomcat)
 
 
2.web Server 80
Apache nginx   iis Web服务器软件
HTTP请求:
GET /index.html HTTP/1.1
HOST:www.baidu.com
 
HTTP响应:
HTTP/1.1 200 OK
...
<html>
...
css
js
</html>
 
Tomcat 8+ 它是一个标准的web server,它又是一个运行Servlet的容器
3.安装与配置Servlet
目录结构
 
 
bin:脚本
conf:配置文件
lib:用到的jar
logs:放日志
temp:临时文件
webapps:存放Web应用的目录
work:jsp转成java文件所存放的目录
4.启动tomcat
  1. 安装jdk   若tomcat用8  就要用jdk8
  2. 配置java_home
  3. 配置 path classpath: .;jre目录
tomcat目录下的startup.bat
 
5.改端口
conf文件夹  server.xml   69行
6.将Tomcat作为一个服务
E:\apache-tomcat-8.5.46\bin>service.bat install tomcat
service remove tomcat   删除服务
 
 
6.部署多站点
Tomcat 是一个Web服务器,要有两个网站
 
step1: 改系统中hosts文件
127.0.0.1 www.baidu.com
127.0.0.1 www.google.com
step2.在盘下新建两个文件夹 baidu&google  新建ROOT文件夹 新建index.html
step3 增加两个域  ,在tomcat_home/conf/server.xml
 
 
 
服务器模型     分为单线程和多线程    阻塞IP/非阻塞IO  两大类型
单线程阻塞I/O模型是最近简单的一种服务器模型,几乎所有的程序员在刚开始接触网络编程时都从这个简单的模型开始。
这种模型只能同时处理一个客户端访问,并且在I/O操作上是阻塞的,线程会一直在等待,而不会做其他事情。对于多个客户端访问,必须要等到前一个客户端访问结束才能进行下一个访问的处理,请求一个一个排队,只提供一问一答的服务。
 
首先服务器必须初始化一个套接字服务器ServerSocket,并绑定某个端口号并使之监听客户端访问。接着客户端1调用服务器的服务,服务器收到请求后对其进行处理,处理完后写数据回客户端1,整个过程都是在一个线程中完成的。最后,处理客户端2的请求并写数据回客户端2,期间就算客户端2在服务器处理完客户端1之前就进行请求,也要等到服务器对客户端1响应完成才对客户端2进行处理。
    这种模型的特点在于单线程和阻塞IO。单线程即服务器只有一个线程处理客户端的所有请求,客户端连接与服务器端的处理线程比是n:1,它无法同时处理多个连接,只能串行处理连接。而阻塞IO是指服务器在读写数据时是阻塞的,读取客户端数据时要等待客户端发送数据并把操作系统的内核复制到用户进程中,这时才接触阻塞状态。
 
 
 
二.使用
 
  1. javax.servlet.Servlet接口

项目添加Tomcat的jar  Servlet类库  :
右键项目  -》 Java Build Path Add Library  --》Server Runtime  
 
  1. Servlet可以处理doGet()和doPost()方法
  2. 在Servlet接口中定义了五个抽象方法
 
 
方法声明
功能描述
void init(ServletConfig config)
容器在创建好Servlet对象后,就会调用此方法.该方法接收一个ServletConfig类型的参数,Servlet容器通过该参数向Servlet传递初始化信息.
ServletConfig getServletConfig()
用于获取Servlet对象的配置信息,返回Servlet的ServletConfig对象
String getServletInfo()
返回一个字符串,其中包含关于Servlet的信息(用处不大,作者版权版本)
void service(ServletRequest req,ServletResponse resp)
负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调用此方法.容器会构造一个表示客户端请求信息的ServletRequest对象和一个用于响应客户端的ServletResponse对象作为参数传递给service()方法.在service()方法中,可以通过Servlet对象得到客户端的相关信息和请求信息,在对请求进行处理后,
调用ServletResponse对象的方法设置相应信息
void destroy()
负责释放Servlet对象占用的资源.当服务器关闭或者Servlet对象被移除时,Servlet对象会被销毁,容器会调用此方法.
void service(ServletRequest req,ServletResponse resp)
 req对应输入流,用于读客户端发来的数据 
resp对应输出流,用于给客户端写数据
 
2.写第一个Servlet程序,了解Servlet运行过程
 
Servlet的实现抽象类GenericServlet  service是抽象方法
package com.demo;
import java.io.*;
import java.lang.*;
import javax.servlet.*;
public class HelloServlet extends GenericServlet
{
    public void service(ServletRequest req,ServletResponse resp)throws Exception
    {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        String name=null!=req.getParameter("name")?req.getParameter("name"):"";
        pw.println("<h1>hello,+"name+"</h1>");
        pw.close();
    }
}
配置web.xml
 
  1.  <servlet>
  2.      <servlet-name>helloser</servlet-name>
  3.        <servlet-class>com.demo.HelloServlet</servlet-class>
  4.   </servlet>
  5.   <servlet-mapping>
  6.       <servlet-name>helloser</servlet-name>
  7.         <url-pattern>/hello.php</url-pattern> <!--最关键的URL-->
  8.   </servlet-mapping>
步骤 :
Step1:将$tomcat_home/lib/servlet-api.jar加入classpath
Step2:写一个HelloServelt实现Servlet接口   GenericServlet
Step3:重写service方法,获取请求并响应
Step4:将Helloservlet字节码放入app/WEB-INF/classes
Step5:映射url和字节码的关系,/WEB-INF/web.xml  
 
两种配置Servlet和url的方式:
 
1.在web.xml文件中传统写
<servlet>
       <servlet-name>hi</servlet-name>
       <servlet-class>com.demo.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>hi</servlet-name>
  <url-pattern>/hello/hi.xx</url-pattern>
  </servlet-mapping>
2.使用annotation @
@WebServlet(name="hi",urlPatterns={"/hi"})
@WebServlet("/welcome")
写在servlet类声明上边
 
ServletConfig和ServletContext
初始化参数信息 在web.xml文件中使用一个或多个<init-param>元素进行配置。当Servlet初始化时,会将该Servlet的配置信息封装到ServletConfig对象中,此时可以通过调用 init(ServletConfig config)方法将ServletConfig对象传递给Servlet
ServletConfig接口中的常用方法

 
 
方法说明
功能描述
String getInitParameter(String name)
根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames()
返回一个Enumeration对象,其中包含了所有的初始化参数名
ServletContext getServletContext()
返回一个代表当前Web应用的ServletContext对象
String getServletName()
返回Servlet的名字,即web.xml中<servlet-name>元素的值
req    resp
PrintWriter pw=resp.getWriter();
ServletConfig  config=this.ServletConfig();
String param=config.getInitParameter("encoding");
pw.println("encoding"+param);
 
web.xml
<servlet>
    <servlet-name>hello</sevlet-name>
    <servlet-class>com.demo.servlet02</servlet-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/welcome</url-pattern>
</servlet-mapping>
运行后可知,web。xml文件为Servlet02配置的编码信息被读取了出来,由此可见ServletConfig对象可以获得web.xml文件中的参数信息。
 
 
 
 
Servlet的生命周期
Step1:启动Tomcat,Tomcat为每个Web站点实例化一个对象(ServletContext)    单实例常驻内存
Step2:加载每个Web app中的web.xml,将每一组Servlet配置封装成一个对象(ServletConfig)初始化参数,URL,Servlet name 
注意:如果Servlet的loadOnStartup=0,那么启动服务器Servlet对象就要初始化(0,1,2,3,4优先级)
Step3:用户向服务器发一个请求消息,其中包含了路径(url)
Step4:tomcat对比你请求的url在不在我服务器上的ServletConfig
Step5:如果你请求的url在服务器中的ServletConfig中,就找到对应的字节码,就实例化对象,如果此字节码对应的对象存在,就不再实例化
Step6:调用Servlet对象的init()方法,并且把ServletConfig对象传入
Step7:调用Service方法为用户服务
Step8:当用户再次访问Servlet时,如果这个Servlet对象存在,直接调用它的Service()方法
Step9:直到服务器宕机时,才调用Servlet的destroy()方法。
 
在WebServlet 注释后边(value="/welcome",loadOnStartup=0)
实例化一次,init一次,service多次 
 
Q1:怎么把eclipse中的Servlet部署包Tomcat(非精简版插件)上:
1.webapps中新建文件夹   
2.把workspace中的项目的WebContent复制
3.把Build中的classes文件夹拷贝到WEB-INF文件夹中 
 
 
ServletRequest 接口
 
 
Servlet forward 可以进行Servlet间的数据传递
 
 
 
 
 
 
 
 
 
 
ServletContext接口
当Tomcat启动时,Tomcat会为每个Web应用创建一个唯一的ServletContext对象代表当前的Web应用,该对象封装了当前Web应用的所有信息。可以利用该对象获取Web应用程序的初始化信息、读取资源文件等。
1.获取Web应用程序的初始化参数
    在web.xml文件中,不仅可以配置Servlet的映射信息,还可以配置整个Web应用的初始化信息。Web应用初始化参数的配置方式具体如下图所示:
    <context-param>
        <param-name>XXX</param-name>
        <param-value>xxx</param-value>
    </context-param>
    <context-param>
        <param-name>AAA</param-name>
        <param-value>aaa</param-value>
    </context-param>
    其中<context-param>位于根元素<web-app>中,它的子元素<param-name>和<param-value>分别用于指定参数的名字和参数值。要想获得这些参数名和参数值的信息,可以使用ServletContext接口中定义的getInitParameterNames()和getInitParameter(String name)方法分别获取。    
ServletcContext context=this.getServletContext();
Enumeration<String> paramNames=context.getInitParameterNames();
while(paramNames.hasNextElements()){
String name=paraNames.nextElement();
String value=context.getInitParameter(name);
out.println(name+":"+value);
out.println("<br/>");
 
 
 
 
 
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值