您的位置:首页 > 运维架构 > Tomcat

Servlet学习(1)-tomcat介绍和Servlet开头

2020-05-21 21:02 197 查看

文章目录



说明

  因为是个人复习java的总结,所以结构稍显杂乱,有些语句过于口语化.
  下面内容包含一部分的Servlet,之后还有HTTP,response,request等内容.


复习之前学过的相关概念

  C/S
  表示客户端和服务器的结构模式

  B/S
  表示浏览器和服务器的结构模式,可以减少对于客户端的维护,更新比较方便

  静态资源
  其实就是服务器中对于用户请求访问得到相同的资源,像html,css.JavaScript这些基本都是用来写静态网页部分的.

  动态资源
  其实就是服务器对于用户的请求相同资源但是会返回不同结果,像servlet/jsp,php,asp,这些则可以用来写动态网页.
  实质上动态资源被访问之后会先转换成静态资源,然后再返回给用户,因为用户那边其实具备的是解析静态资源的解析器.或者说就是后端对前端的请求,进行分析,连接数据库寻找适当资源,之后将资源总和成静态资源发送给客户端.

  IP地址
  电子设备在网络中的唯一标识,像IP4,IP6

  端口号
  应用程序再计算机中的唯一标识,范围是在0-65536

  传输协议
  其实就是设备之间进行通信需要规定的一些统一的协议,像传递数据的格式,通信请求的方式等

  TCP协议,其实就是需要设备之间建立通信的一种较为安全的协议,具体内容像建立时的三次握手,结束时的四次握手.但是其传递的速度稍慢.

  UDP协议,其实就是不需要进行通信的不安全广播协议,不需要设备之间建立通信,而是直接进行发送数据,速度快,但是很可能丢数据.一般用在像视频直播之类对于丢一点数据包没有关系,要求传输的速度的地方.


web服务器软件

  服务器其实就是安装了服务器软件的计算机.而这些服务器软件其实主要就是为了能够接收用户的请求,然后处理这些请求,做出响应.
  web服务器其实就是针对B/S模式的服务器,可以在服务器中部署一些web资源,然后让用户通过浏览器对这些资源进行访问.


java常见的web服务器软件

  webLogic,webSphere,JBOSS,Tomcat


Tomcat

  安装之类的就不写了,之前都配过了,没什么难的.
  关于Tomcat上项目部署的方式,当然用idea,eclipse都是每次启动自动配置的,但是编程软件一关就没了.所以了解一下自己部署.其实总共有三种方式

  1. 直接将项目的文件拉到tomcat目录下的webapps.对于放入的资源其实可以打包成一个.war格式的包,然后tomcat会自动将包解压缩,然后生成文档部署.如果想要删除,直接删除war包Tomcat会自动将部署的资源删除.其实这样的好处是相对而言可以更快地传输想要部署的资源.对于这种方式访问的路径就需要在ip之后再加上\哪个文件夹\哪个文件
  2. 在conf\Catalina\localhost目录下创建一个xml,然后在文件中写入
    <Context docBase="资源路径" />
    ,这样就可以部署成功,访问时就通过xml名作为根目录进行访问.另外这种方式有一个好处,是热部署的,也就是可以在部署之后对文件进行操作,Tomcat也会根据操作有相应反应.这也是最常用的方式
  3. 最后一种方式其实不大使用,就是在conf/server.xml中写入
    <Context docBase="资源路径" path="虚拟目录路径">
    .其实就是在tomcat的配置文件中进行修改,一不小心容易造成问题.


静态项目和动态项目在部署上的资源区别

  其实就是静态项目只有一些静态网页,而动态项目还包含一个WEB-INF的文件夹,其下包含像web.xml项目的配置文件,classes放字节码文件,lib项目的依赖jar包.
  其实就是多了一部分需要根据用户请求进行响应的操作代码.注意放的是经过编译的.class字节码文件.


servlet

  其实就是在服务器,考虑动态资源的时候,里面的一些java程序是依赖于Tomcat来运行的,那么servlet其实就是帮助Tomcat识别运行哪些java类的接口


  使用servlet的话首先需要在javaEE项目中创建一个类并且实现servlet接口,然后重写其中的方法,然后就可以在对应方法中写一些内容,其中方法的具体介绍后面迟点再写,下面先简单的了解一下怎么运行这个servlet.

public class ServletDemo 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 {
System.out.println("hello");
}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

  上面就创建了一个类,目前只在service中写了一个输出,然后需要在WEB-INF下的web.xml配置文件中配置servlet

<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>servlet.ServletDemo</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>

  上面就是将servlet包下的ServletDemo命名为demo1,然后再配置了需要启动这个demo1的虚拟路径是/demo1


  上面Tomcat实际运行的步骤是,接收到访问请求之后,首先根据对方的URL确定部署的项目,然后就会到web.xml配置文件中查找他请求的虚拟路径也就是中内容是否存在相同的,确认之后再通过其确定.然后就会将指定的class运行,并创建对象,根据不同时间调用不同的方法.后面还会深入了解这些步骤.



  这里记一个遇到的小问题,使用idea配置Tomcat之后部署的web文件不会放在webapps文件夹下,不知道webapps文件夹可以回忆一下上面的部署Tomcat.采用的方式是类似上面说的第二种方式,将不同目录的文件配置给了web,所以在使用浏览器访问的时候注意虚拟路径.
  另外可以在Tomcat的deployment下修改虚拟路径名,从而实现自己想要访问不同项目时好分辨.


Servlet中的方法

public void init(ServletConfig servletConfig) throws ServletException {}

  初始化方法,从命名就看得出来.这个方法只会在Servlet创建对象的时候调用一次具体的时间需要下面再继续深入了解Servlet的生命周期才能更好地理解

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}

  也就是Servlet提供的服务,每次Servlet被访问都会执行一次

public void destroy() {}

  Servlet的销毁方法,也就是在服务器正常关闭的时候才会执行,注意是正常的关闭.

public String getServletInfo() {}

  这个方法是用来提供Servlet的一些信息像版权,作者,版本等信息,但是是一个可选信息.

public ServletConfig getServletConfig() {}

  这个方法则是用来返回调用了Servlet初始化方法的对象的.看初始化的方法也可以看出传入了一个SeverletConfig对象,就是用来返回这个对象的方法.


Servlet生命周期

  1. 创建
    默认情况下是在第一次被访问到的时候创建了Servlet对象,然后执行了初始化方法.
    但是其实可以配置Servlet的创建时机,配置的话其实就只能配置第一次访问的时候执行或者服务器启动的时候执行.具体语句如下:
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>servlet.ServletDemo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

  在web.xml中给servlet配置load-on-startup,其中的值默认为负数表示在第一次访问的时候创建对象.如果改成0或正整数就会变成在服务器启动的时候调用.

  1. 提供服务
    每次访问Servlet时,就会调用一次,也就是访问到配置在web.xml中的虚拟路径的时候就会调用一次.
  2. 被销毁
    只有在服务器正常关闭的时候才会执行destroy()方法,然后销毁Servlet对象.一般都是最后要释放资源了才调用destroy()方法,注意destroy()方法是我们写的类下的一个方法,如果先销毁了Servlet对象就没法调用destroy()方法了.


对于Servlet中一些问题的思考

  其实从Servlet的生命周期会发现一个问题,Servlet的对象只创建一次,只有一个Servlet对象.可是用户不止一个.如果多个用户同时访问势必会造成安全问题.也就是对于上面我们重写的类来说,其中设置一些资源肯定会造成问题.至于解决肯定不可能使用锁,用户量一大会让用户的体验非常不好.那么只能使用编写类的时候注意,不要创建需要进行赋值或者修改的成员变量,有需要在service中使用局部变量.

  从上面的配置可以看到,Servlet的配置很繁琐,但是其实现在可以直接使用注解进行配置,不需要使用web.xml进行配置了.这也是之前反射注解那部分提到过的,使用注解进行配置文件.

@WebSverlet("/demo")

  使用注解省略了大量的配置信息,其实注解中还有很多参数可以传,但是基本都有配置默认值,所以可以直接传入一个作为urlPatterns的值.也就是传入一个虚拟地址.


GenericServlet

  其实是一个实现了Servlet接口的抽象类,其中只留了一个

service()
方法作为抽象类,其他方法都做了空实现的处理.这样就可以通过继承这个类来事项Servlet,然后根据需要来重写其他方法,但是实际上这种方式基本上是不用的.


HttpServlet

  其实是GenericServlet的子类,其中封装了

doGet()
doPost()
.这也是比较常用的一种类,继承这种类来实现Servlet.
  其实我们在Servlet中进行的最多的操作就是获取前端传回的数据,那么对于传回的数据,像表单中,分为POST和GET的发送方式,而我们在Servlet中如果需要获取数据,就要对传递的方式进行判断,然后获取数据再进行一些操作.这段代码就比较繁琐.
  而HeepServlet中就将这些进行了封装,我们只需要重写doGet()和doPsost()方法就能实现对于表单不同提交方式的操作.


Servlet中urlpartten的配置

  其实使用的基本都是注解配置,而其中配置的urlpartten是可以有多个的,也就是

@WebServlet({"demo","demo1"})

  可以给一个Servlet配置多个访问路径
  对于这个访问路径其实还可以使用

/xxx/xxx
的多层结构,也就相当于给访问路径多加了一层,用的不大多
  还有就是使用
*.do
的配置,也就意味着只要在访问服务器的时候,没有找到对应的资源,但是访问路径结尾又是.do的,就会调用这个Servlet,这个使用看具体情况.
其实最主要的配置方式还是使用
/访问路径



如有错误欢迎读者批评指正!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: