一、web项目结构

|- WebRoot :   web应用的根目录

|- 静态资源(html+css+js+image+vedio)
                            |- WEB-INF : 固定写法。(tomcat目录无法访问)

|-classes: (可选)固定写法。存放class字节码文件

|-lib: (可选)固定写法。存放jar包文件。

|-web.xml   核心配置文件,
后端代码的入口

    注意:

1)WEB-INF目录里面的资源不能通过浏览器直接访问

2)如果希望访问到WEB-INF里面的资源,就必须把资源配置到一个叫web.xml的文件中。

二、手动开发动态资源

2.1 静态资源和动态资源的区别

  静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源。

  动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变。

2.2 动态资源开发技术

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

  Servlet特点:

    1)普通的java类,继承HttpServlet类,覆盖doGet方法

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

  servlet代码

public class HelloServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//解决中文乱码问题
resp.setCharacterEncoding("utf-8");// 内容编码,防止出现中文乱码
resp.setContentType("text/html;charset=utf-8"); //向浏览器输出内容
resp.getWriter().write("这是第一个servlet程序。当前时间为:"+new Date());
}
}

  web.xml配置

<!-- 配置一个servlet程序 -->
<servlet>
<!-- servlet的内部名称 ,可以自定义-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet类名: 包名+简单类名-->
<servlet-class>com.stu.HelloServlet</servlet-class>
</servlet> <servlet-mapping>
<!-- servlet的内部名称,和上面的名称保持一致!!!-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的访问名称: /名称 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>

  启动Tomcat服务器,运行访问 http://localhost:8080/myweb/ hello

三、工具开发动态资源

  1)创建web project (javaweb工程)

  2)在WebRoot下建立静态资源文件,

  3)在src下建立动态资源文件

    3.1 new -> Servlet( servlet的代码生成器)

    3.2 写pacakge  -> class名 -> 修改mapping  url

  4)关联tomcat服务器

    4.1 window-> Preferences - > MyEcplise -> servers -> Tomcat 6.x (注意一定要enable)

  5)部署web project应用。(拷贝web应用到tomcat的webapps目录下)

  6)启动tomcat服务器

  7)访问servlet       http://localhost:8081/myWeb/hello

3.1 如何开发一个servlet

  1)编写java类,继承HttpServlet类

  2)重写doGet和doPost方法

  3)在we.xml文件配置

<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>com.stu.FirstServlet</servlet-class>
</servlet> <!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>

  4)将项目添加到Tomcat容器中,启动Tomcat。访问地址 http://localhost:8080/myweb/first

  Tomcat执行原理:tomcat服务器启动时,首先加载webapps中的每个web应用的web.xml配置文件。

http://: http协议

localhost: 到本地的hosts文件中查找是否存在该域名对应的IP地址 / 127.0.0.1

8080:    找到tomcat服务器

/myweb     在tomcat的webapps目录下找 myweb的目录

/first    资源名称。

1)在myweb的web.xml中查找是否有匹配的url-pattern的内容(/first)

2)如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的servlet配置

3)如果找到,则取出对应的servlet配置信息中的servlet-class内容:

字符串: com.stu.servlet.FirstServlet

                      通过反射:

                          a)构造FirstServlet的对象

                          b)然后调用FirstServlet里面的方法

  ecplise与tomcat集成,集成后,tomcat会拷贝一份,创建在ecplise的项目路径下的.metadata目录下。可在server弹窗内,双击打开tomcat配置页的local修改

3.2 servlet 注解版本

  Servlet3.0以上使用,注解自动映射@webServlet。在类名上写注解,无需再在web.xml配置。

3.3 servlet的生命周期

  Servlet程序的生命周期由tomcat服务器控制的!

  1)servlet重要的4个生命周期方法

    构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。

    init方法: 创建完servlet对象的时候调用。只调用1次。

    service方法: 每次发出请求时调用。调用n次。调用doget…

    destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

  问:怎么证明servlet是单例,第一次请求才创建

    通过构造函数,如果构造函数只被执行一次,就是单例的。因为servlet是通过web.xml的class路径来反射生成对象,class.forname方法会调用无参构造函数

  2)代码演示servlet的生命周期

    Tomcat内部大妈运行:

      a、通过web.xml的servlet-mapping映射找到到servlet-class的内容,字符串:com.stu.servlet.FirstServlet

      b、通过反射构造FirstServlet对象,得到字节码对象:Class clazz = class.forName("com.stu.servlet.FirstServlet");

    调用无参数的构造方法来构造对象:Object obj = clazz.newInstance();     ---1.servlet的构造方法被调用      

      c、创建ServletConfig对象,通过反射调用init方法,得到方法对象:Method m = clazz.getDeclareMethod("init",ServletConfig.class);

调用方法,m.invoke(obj,config);             --2.servlet的init方法被调用

      d、创建request,response对象,通过反射调用service方法,得到方法对象:

        Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

调用方法:m.invoke(obj,request,response);  --3.servlet的service方法被调用

      e、当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法

        得到方法对象:Method m = clazz.getDeclareMethod("destroy",null);

        调用方法:m.invoke(obj,null);            --4.servlet的destroy方法被调用

  3)用时序图来演示servlet的生命周期

  

3.4 servlet的自动加载

  默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。改变servlet创建对象的时机: 提前到加载web应用的时候!!在servlet的配置信息中,加上一个<load-on-startup>即可!

<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>com.itmayiedu.life.LifeDemo</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>

  注解方式自动加载:加载顺序为1

  @WebServlet(name="YourServlet",urlPatterns = "/YourServlet",loadOnStartup=1)

3.5 servlet 的多线程并发问题

  servlet对象在tomcat服务器是单实例多线程的。因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

   解决办法:

    1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)

    2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

package com.servlet;

import java.io.IOException;
import java.util.Date; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @classDesc: 功能描述:(线程安全演示)*/
public class ServetlDemo4 extends HttpServlet {
private int i = 1;
public void init() throws ServletException {
System.out.println("ServetlDemo4...init()");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");// 内容编码,防止出现中文乱码
resp.setContentType("text/html;charset=utf-8");
synchronized (ServetlDemo4.class) {
// 向浏览器输出内容,该段代码可能出现不安全,加上同步锁
resp.getWriter().write("这是第" + i + "次访问...");
try {
Thread.sleep(5000);
} catch (Exception e) {
}
i++;
}
}
public void destroy() {
System.out.println("ServetlDemo4...destroy()");
}
}

四、ServletContext对象

4.1得到web应用路径

  java.lang.String getContextPath()  用在请求重定向的资源名称中

  this.getServletContext().getContextPath() 项目路径

4.2 域对象有关的方法

  域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。

    案例:

      Servlet1                                   Servlet2

      name=eric

      response.sendRedirect("/Servlet2?name=eric")             String request.getParameter("name");

      保存到域对象中                          从域对象获取

    方案1: 可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。

    方案2: 可以使用域对象共享数据,好处:可以共享任何类型的数据!

  ServletContext就是一个域对象!

    保存数据:void setAttribute(java.lang.String name, java.lang.Object object)

    获取数据: java.lang.Object getAttribute(java.lang.String name)

    删除数据: void removeAttribute(java.lang.String name)

  ServletContext域对象:作用范围在整个web应用中有效!!!

  所有域对象:

    HttpServletRequet 域对象

    ServletContext域对象

    HttpSession 域对象

    PageContext域对象

4.3 转发与重定向

  1)转发
  req.getRequestDispatcher("/地址").forward(req, resp);

    a)地址栏不会改变,不会暴露真实地址

    b)转发只能转发到当前web应用内的资源

    c)可以在转发过程中,可以把数据保存到request域对象中

  2)重定向                  
  resp.sendRedirect("/地址");

    a)地址栏会改变,变成重定向到地址。

    b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。

    c)不能再重定向的过程,把数据保存到request中。

    d)  重定向效率低

  自定义重定向:

response.setStatus(302);
response.setHeader("Location","OtherServlet"); //目标地址

  重定向:客户端请求第一个servlet后,该servlet会返回302给客户端,客户端会再次发起请求访问目标servlet。所以是两次请求,2个request。

  结论: 如果要使用request域对象进行数据共享,只能用转发技术!

深入了解servlet的更多相关文章

  1. servlet文件下载

    创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...

  2. java中servlet的各种路径

    1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...

  3. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  4. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  5. servlet 简介,待完善

    什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...

  6. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  7. servlet使用入门

    创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...

  8. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  9. [Servlet] 初识Servlet

    什么是Servlet? 定义 Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序. Servlet 是一个 Java Web开发标准,狭义的Servle ...

  10. Java Servlet+Objective-c图上传 步骤详细

    一. Servlet 1.创建图片保存的路径 在项目的WebContent下创建一个上传图片的专属文件夹. 这个文件夹创建后,我们保存的图片就在该文件夹的真实路径下,但是在项目中是无法看到上传的图片的 ...

随机推荐

  1. 学习ASP.NET Core Razor 编程系列十一——把新字段更新到数据库

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. KOA中间件的基本运作原理

    示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 在中 ...

  3. 《C#并发编程经典实例》学习笔记—2.2 返回完成的任务

    问题: 如何实现一个具有异步签名的同步方法. 从异步接口或基类继承代码,但希望用同步方式实现方法. 解释一下所谓的异步接口和异步基类.例如如下代码 interface IMyAsyncInterfac ...

  4. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

  5. 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中

    List<Person> list = new List<Person> { new Person{Name="张三",Age=20,Email=" ...

  6. 数据库缓存mybatis,redis

    简介 处理并发问题的重点不在于你的设计是怎样的,而在于你要评估你的并发,并在并发范围内处理.你预估你的并发是多少,然后测试r+m是否支持.缓存的目的是为了应对普通对象数据库的读写限制,依托与nosql ...

  7. java的设计模式 - 静态工厂方法

    静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.va ...

  8. 数据库学习(MySQL):JDBC的简单增删改查实现

    本文为原创,转载请注明出处: https://www.cnblogs.com/Tom-shushu/p/9171896.html 这里我们先在数据库建立一个userinfo表: CREATE TABL ...

  9. html 表单input录入内容校验

    <p>文本框只能输入数字代码(小数点也不能输入)</p><input onkeyup="this.value=this.value.replace(/\D/g, ...

  10. Android为TV端助力:EventBus跨进程发送消息

    单一app内的用法 如果你在单一app内进行多进程开发,那么只需要做以下三步: Step 1 在gradle文件中加入下面的依赖:   dependencies {   compile 'xiaofe ...