一篇文章让你深入理解Servlet

深入理解Servlet

在一个开始先看下web项目的目录结构

Web项目结构

webapp — 根目录

​ static — 静态资源 js css

​ WEB-INF — tomcat访问不了

​ Classes 字节码文件(java后端代码)

​ LIb 项目中需要加载jar

​ Jsp jsp

(静态资源:源代码不会改变 动态资源:代码随时都会发生改变)

Servlet就是动态资源开发技术

想要写一个servlet其实就是写一个java文件实现servlet接口或者继承GenericServlet类,或者继承HttpServlet类然后再去重写doGet()和doPost()方法(当然还有别的方法共七个,我就不一一举例了)。

如果会有乱码情况的话

resquest.setCharacterEncoding("utf-8");//内容编码
resquest.setContentType("text/html;charset=utf-8")//向浏览器输出内容

注:实际工程会用过滤器去解决,不会这么写

源的开发技术

Servlet:用java语言来编写动态资源开发技术

Servlet特点:1)普通java类,实现servlet接口或者继承GenericServlet类,或者继承HttpServlet类

​ 2)Servlet类只能交给tomcat服务器运行开发者不能自己运行

像后端常用的Spring、MVC 等控制层框架都是通过servlet进行实现

注:tomca运行位置tomcat会拷贝一份,创建个副本在你的项目底下。

注解

每次更改web.xml文件很复杂啊,当然有的ide会帮你自动创建这个暂且不提,为了解决这个麻烦,servlet3.0支持注解了

@WebServlet(name="", urlPatterns="")

servlet生命周期

servlet实际上是单例,第一次请求时创建,永远在jvm中只有一个实例,下面看下他的工作原理

一篇文章让你深入理解Servlet_第1张图片

这里可以看出如果Servlet存在的话,就不会新建,只会直接调用Service()方法

当服务器停止时销毁

servlet的自动加载

如果servlet的构造方法或init方法中有很多的逻辑代码,那么将会导致用户第一次访问servlet的时候比较慢,那我们就需要改变servlet的创建对象的时机:提前到加载web应用的时候!!!

解决方法:在servlet的配置信息中,加上一个即可

<servlet>
    <load-on-startup>1load-on-startup> 
    
servlet>

servlet线程是否安全

servlet是单例,servlet不安全

因为线程共享一个全局变量,可能会受到其他线程的干扰,数据导致错乱,这就是线程不安全

这个证明略微粗糙了些,下面我给大家讲下流程

  1. tomcat加载web.xml配置
  2. 发生请求来源时,如果请求是访问servlet,会找到servlet的配置
  3. 读取servlet配置,解析servlet-class
  4. 通过java的反射机制, 调用class.froname() class.newInstance(); 无参构造函数创建Serlet对象
  5. 执行servlet无参构造函数
  6. init()
  7. 先走service方法,进行判断是什么情求方法,最后执行具体请求方法
  8. 服务器停止掉,destroy()方法

不安全解决办法非常简单,用synchronized就可以了,并且不要共享全局变量

servlet上下文ServletContext

通过上下文可Servlet可以和容器进行通信并获得运行的环境参数

创建方法:

  1. 在新建的Servlet子类中覆盖代有参数的init方法

    public void init(ServletConfig config) throws ServletException
    
  2. 在Servlet子类中直接调用GenericServlet 的getServletContext()方法得到上下文对象

servletContext作用域

上下文的作用域是保存服务器端—不建议大家使用,多用户共享—类似全局变量效果

转发和重定向区别

转发:客户端请求A,A直接转发给B

  1. 不暴露被转发真实地址
  2. 转发是内部跳转,传request进去,为web应用为根

从定向:客户端请求A,A返回客户端302,客户端再请求B

  1. 重定向效率低
  2. 因为是重复请求,所以地址发生改变,服务器为根

你可能感兴趣的:(实习,javaee,javaweb,servlet)