第二天问题总结

1。什么是Servlet?
A servlet is a small Java program that runs within a Web server.
翻译:
2.作用?
Servlets receive and respond to requests from Web clients,
usually across HTTP, the HyperText Transfer Protocol.
翻译:
3.写法?
myapp
WEB-INF:
classes
servlet编译之后代码放到这个包下
lib
web.xml
css
html
img
js

1.类的写法?
package com.itheima.servlet;
import javax.servlet.*;
import java.io.*;

public class HelloWorldServlet extends GenericServlet
{
public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException{
res.getWriter().write("Hello World");
}
}

2.编译
set classpath=%classapth%;C:\apache-tomcat-6.0.37\lib\servlet-api.jar
javac -d . HelloWorldServlet.java

3.配置文件
在web.xml中添加servlet的配置
<servlet>
<!--自己配的一个名称-->
<servlet-name>hello</servlet-name>
<!--一定是servlet类所对应全路径-->
<servlet-class>com.itheima.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--自己配的一个名称-->
<servlet-name>hello</servlet-name>
<!--映射的一个URL,一定是/开头(具体路径)-->
<url-pattern>/cgx/aj</url-pattern>
</servlet-mapping>

4.Eclipse的写法
1.新建web项目
src开发目录下的内容,在部署到tomcat后,会放到WEB-INF/classes目录下
WebRoot开发目录下的内容 ,在部署到tomcat后,会完整的放入到当前应用名下
2.新建一个Servlet
3.部署
4.运行

替换Servlet模板
·1.到MyEclipse安装目录下 *wizard*.jar
2.替换templates/Servlet.java

思考 : doGet()能处理get请求,
doPost()可以处理post请求
它们与Service()方法的关系 ?
当用户发起请求起,始终调用的是service()方法,而这个方法内部会进行判断
并决定是调用 doGet(),还是doPost()
而咱们自己定义的Servlet又重写了doGet(),doPost()

结论:不要自己重写service()方法,因为父类有这个方法,一般只要重写doGet(),doPost()就可以了

扩展:模板方法设计模式
public class A{
service(){
doGet();
doPost();
}
public abstract void doGet();
public abstract void doPost();
}

public class B extends A{
public void doGet(){

}

public void doPost(){

}
}

public static void main(String args[]){
A a = new B();
a.service();
}
5.生命周期:
The servlet is constructed, then initialized with the init method.
Any calls from clients to the service method are handled.
The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.

1.在默认情况下,Servlet生命周期执行过程如下:
在用户第一次请求时:
1.实例化:构造方法1次
2.初始化:(init):1次
3.服务:(service),以后每次请求,都会直接执行service() :N次
4.销毁:当服务器停止或应用被移除,此时销毁destory()方法执行: 1次

2.改写生命周期
是通过<load-on-startup>来实现的
取值: 整数(1开始 越小优先级越高)

结果?
服务器启动时,对应的Servlet就会执行生命周期(实例化,初始化)
以后每次用户执行时,走service()方法

优点:当用户每一次请求时,速度会变快
缺 点:如果load-on-startup配置太多,Tomcat启动速度会变慢
6.具体详细配置:
1.可以配多个映射地址
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/servlet/MyFirstServletDemo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/aj</url-pattern>
</servlet-mapping>
2.通配符的使用
1./* (/servlet/* /* )
2.*.扩展名(*.do *.action )

不要这写成/*.action

<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>*.czbk6</url-pattern>
</servlet-mapping>

http://localhost:8080/myapp/hello.action

3.总结规律:
1.能精确匹配的用精确匹配
2./*优先级高于*.扩展名

3.可以配置一个缺省的Servlet
1.写法: /
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.当请求静态资源时,如果找不到,则执行缺省的Servlet
if("1.jpg"找到了){
显示图片
}else{
没有找到 显示404
}

3.这个缺省的Servlet一般不配置,为什么?
在Tomcat的web.xml中有

7.线程安全
启发:
说明servlet不是线程安全的,而且它设计目标就是采用多线程来处理用户请求

线程安全问题解决方法:
1.synchronized:线程同步
2.用单线程:就是实现SingleThreadModel接口

总结:这两种方法都不行,违背了设计意图!!!

最终解决办法:
程序员自己注意,不要定义成员变量,尽量用局部变量
合理决定在Servlet中定义的变量的作用域

总结:
1.什么是Servlet?
2.如何写一个Servlet类并进行配置?
3.在MyEclipse工具下如何创建一个Servlet并发布到Tomcat中,启动Tomcat
4.MyEclipse工程的目录结构与Web应用程序发布到Tomcat的关系?
5.Servlet生命周期?以及如何改写生命周期
6.源码分析为什么可以直接写doGet,doPost()方法
7.配置Servlet的细节问题?
8.得到一个启发?

4.ServletConfig
1.什么是ServletConfig
A servlet configuration object used by a servlet container used to
pass information to a servlet during initialization
2.作用?
1.得到初始化参数?
如何配置初始化参数?
<init-param>
<!-- 参数名 -->
<param-name></param-name>
<!-- 参数名所对应取值 -->
<param-value></param-value>
</init-param>

注意:该标签出现在<load-on-startup>之前
getInitParameter("参数名");
getInitParameterNames();
3.得到一个ServletConfig实例的两种方法?
1,init(ServletConfig config)

2.getServletConfig(); //继承父类GenericServlet或它的子类才行

只能用其中一个

实现效果:
因为每个Servlet都要配置相同初始化参数,可不可以配置通用的初始化参数?

5.ServletContext
1.什么是ServletContext?
它是服务器产生的一个对象,它用于实现各个Servlet之间信息共享 ,用于获取全局初始化参数
1.它是运行在web容器中,每个web应用程序都会有一个自己唯一的ServletContext对象。
2.由web容器在加载应用时,就创建好了。
3.它跟web应用程序同生命周期

2.作用?
1.作为一个全局范围的域对象来用(四大域作用范围),可以实现应用范围的数据共享.实现各个Servlet之间信息共享
实现原理:
就是在全局范围内维护一个Map集合
setAttrbite(key,Value);
Object obj = getAttribute(key);
removeAttribute(key);

2.获取全局化参数
getInitParameter("");
getInitParameterNames();

3.得到文件的绝对路径
相对路径:/WEB-INF/classes/1.jpg
而相对于谁?第一个/代表当前web应用程序
绝对路径: C:\apache-tomcat-6.0.37\webapps\day07_00_servlet/WEB-INF/classes/1.jpg
getServletContext().getRealPath("/WEB-INF/classes/1.jpg");//相对于本应用,咱们现在这个路径是绝对定位

4.实现Servlet的转发。
1.什么是转发?
A-->B--->C
重定向
A-----我 (10000 我没有)

实现步骤:
1.得到转发器 路径一定是绝对路径
RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/ServletContextDemo1");
2.转发
rd.forward(request, response);
2.实现方式
//放入iphone6
sc.setAttribute("gift", "iphone6");
//转发,采用ServletContext实现转发时,不能用相对路径,只能用/开头代表一个绝对路径
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo5");//转发器

//rd.forward(request, response);//转发

//在实现包含时,它会将目标对象的响应正文包含进来,如果设置有响应头也不起作用
rd.include(request, response);//包含

3.转发与重定向区别?
//转发的特点:
//1.地址栏不变
//2.说明客户端向服务器发送只有一次请求
//3.放在request 域中的值可以共享 (request域还没有讲,先总结了)

//重定向
//1.地址栏改变
//2.客户端发送了2次请求
//3.放在request 域中的数据不能共享

5.利用ServletContext对象读取资源文件
参考示例?

3.如何得到它的实例?
getServletConfig().getServletContext()

getServletContext()

总结:
1.怎么去写Servlet?
2.如何配置?
3.发布
4.MyEclipse下如何写Servlet?
5.各种URL配置?
6.生命周期?
7.改写生命周期?
<load-on-startup>10</load-on-startup>
8.多线程?

9.ServletConfig
得到初始化参数:init-param

10.ServletContext
1.是什么?
2.作用?
1.应用范围的域对象
2.得到应用范围初始化参数:context-param
3.得到文件真实路径:文件下载
4.转发与包含
5.四种资源文件的读取方法

时间: 2024-11-06 20:45:28

第二天问题总结的相关文章

C#图解教程 第二十四章 反射和特性

反射和特性元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特性其他预定义特性有关应用特性的更多内容多个特性其他类型的目标全局特性自定义特性声明自定义特性使用特性的构造函数指定构造函数使用构造函数构造函数中的位置参数和命名参数限制特性的使用自定义特性的最佳实践访问特性使用IsDefined方法使用GetCustomAttributes方法 Note 类的元数据包含

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

软件工程第二次作业--师兄采访

我采访的是李权师兄,虽然之前也有人采访过他,问题都是同样的问题,不过我挖掘出了和其他同学不一样的信息. 问题:    师兄,当时你们做的项目是什么,有多少用户, 现在还有人用吗? 李权师兄: 当时我们的项目名是约跑APP,当时用户有8人.在用户的手机上测试通过,能让用户找到一起跑步的小伙伴.现在已经没有人用了. 追问:该app给用户提供了什么样的服务? 李权师兄:app能提供给用户认识新朋友的平台.通过app,用户可以约人一起跑步. 第二个问题:师兄这个项目能否给我们团队继续开发,源代码还有么?

第二次作业——个人项目实战:数独

1.阅读 刚开始泛看<构建之法>的时候,还是觉得非常难理解里面的内容,特别是代码部分.后来第二次拿起这本书,从第一章开始看起,慢慢了解了"软件企业=软件+商业模式"和对软件工程的定义,但是更多地还是记忆了一遍,没有明白这里面的深意:看第二章的时候,跟着单元测试.回归测试的.效能分析的内容自己照着书上的代码敲了一敲,偶尔会出现bug,但是能得到书上所说的效果还是很开心的,效能分析,感觉就是代码的效率问题,追求高效,然后接触到了软件工程师的一套模型-个人开发流程PSP,我也尝试

团队作业八——第二次团队冲刺(Beta版本)第6天

团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题文件写入. (3) 工作中遇到的困难 今天花了较多时间在完善登录注册界面上,这让我们比较担心,如果每天都花很多时间在解决之前的问题,当天的任务又做不好,会不会赶不上进度.如果每天都不能正常完美的完成每天任务,那冲刺最后一天结束的时候,又哪里再有一个明天给我们完善代码.且今天还遇到了写入SD存储卡文件

《构建之法》第二次

第二章讲的是个人技术和流程.绝大多数软件是由多人合作完成的.单元测试能够让自己负责的模块功能定义更加明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的.量化的保证. 创建一个单元测试函数的主要步骤是: 1.设置数据 2.使用被测试类型的功能 3.比较实际结果和预期的结果 在写技术模块规格说明书的时候,要越详细越好,最好各项要求都可以表示为一个单元测试用例.单元测试也并不是件容易的事,单元测试应该准确.快速地保证程序基本模块的正确性.首先单元测试应该在最基本的功能/参数上验证程序的正

分享第二届中国前端开发者大会与会心得

第二届中国前端开发者大会(FDCon2017)是在上海举办的针对前端技术(HTML5,CSS,JS)的互联网开发者所举办的最盛大和权威的相关技术会议,由技术社区TopGeek主办.汇智Tek联合主办,致力于推动各类前端技术等在移动互联网领域的研发和应用. 随着新一代的前端技术的发展,给前端开发者带来巨大的创新应用实践机会,本大会以“高效前端开发实践和创新”为主题,内容涵盖电商.旅游.门户.搜索.分类广告.移动互联网等多种业态的技术经验分享,涉及各种WEB和APP前端开发技术和架构设计等方法论.

TensorFlow【机器学习】:如何正确的掌握Google深度学习框架TensorFlow(第二代分布式机器学习系统)?

本文标签:   机器学习 TensorFlow Google深度学习框架 分布式机器学习 唐源 VGG REST   服务器 自 2015 年底开源到如今更快.更灵活.更方便的 1.0 版本正式发布,由 Google 推出的第二代分布式机器学习系统 TensorFlow一直在为我们带来惊喜,一方面是技术层面持续的迭代演进,从分布式版本.服务框架 TensorFlow Serving.上层封装 TF.Learn 到 Windows 支持.JIT 编译器 XLA.动态计算图框架 Fold 等,以及

第二十二篇:信号的接收和处理

前言 要想掌握 Linux 系统编程,自然要好好学学其信号机制. 本文介绍一个简单的信号接收处理程序,为后面继续深入学习信号机制打下基础. 什么是信号 信号是软件中断,它提供一种处理异步事件的方法. 信号产生的条件 1. 当用户按某些终端按键时.比如:Ctrl + D / Ctrl + C 等. 2. 硬件异常.比如:除数为 0,无效内存引用等. 3. 调用 kill 函数可以将信号发送给另一个进程或者进程组. 4. 当检测到某种软件条件已经发生时.比如:alarm 到时,网络传来某些带外数据时

第二十一章、使用查询表达式来查询内存中的数据

什么是语言集成查询(LINQ) 对从应用程序代码中查询数据的机制进行了“抽象”.这个功能称为“语言集成查询”(Language Integrated Query). LINQ的设计者大量借鉴了关系数据库管理系统(例如Microsoft SQL Server)的处理方式,将“数据库查询语句”与“数据在数据库中的内部格式”分隔开.LINQ的语法和语义和SQL很像,具有许多相同的优势.要查询的数据的内部结构发生改变后,不必修改查询代码.注意,虽然LINQ和SQL看起来很像,但LINQ更加灵活,而且能处