1.servlet是什么:
servlet是一个位于服务器端的java应用程序
它可以像jsp一样,直接输出信息

servlet类必须继承HttpServlet类,否则,不能称为serlvet

servlet类是一个java类,但是有自己的规则
servlet必须在web.xml文件中注册
服务器在启动的时候,可以根据这些配置来加载servlet类.......

2.servlet作用:
C:控制层
serlvet主要用来做控制转发,需要结合到MVC模式(套路)

3.servlet生命周期:
init
service
destroy

/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
* 在servlet被第一次访问时,本方法将会被自动调用
* 本方法被称为初始化方法
* 只会被调用一次
*/
public void init() throws ServletException {
// Put your code here
System.out.println("我是init方法");
}

/**
* 具体的业务方法
* 该方法将会被调用多次
* 每次访问servlet时,该方法都会被调用
* service根据request.getMethod得到你的提交方式,然后由它来决定对doGet.doPost的调用
*/
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
super.service(request, response);
System.out.println("我是service.....................................");
}

/**
* Destruction of the servlet. <br>
* servlet被注销的时候
* 本方法为销毁方法
* 也只是被服务器自动调用一次

*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("destroy方法被调用..............");
}

4.定义servlet的必需的步骤
A.定义一个类,继承HttpServlet
B.重写doGet和doPost方法
C.实现doGet和doPost的逻辑
D.在web.xml部署描述文件中定义servlet的映射方式

5.为web应用设置一个欢迎页面

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

如果第一个页面找不到,会依次向下找

6.request和其他类的关系

HttpSession session = request.getSession();
session.setAttribute("username", "scott"); ServletContext application = this.getServletContext();
application.setAttribute("userlist", null); RequestDispatcher rd = request.getRequestDispatcher("C.jsp");
rd.forward(request, response);

7,在servlet中使用session

HttpSession ss = request.getSession();
List list=new ArrayList();
list.add("SMITH");
list.add("ALLEN");
ss.setAttribute("userlist", list);

8.关于servlet的使用方式

servlet可以像jsp一样被访问
A.在地址栏内可以直接输入地址来访问
http://localhost:8088/myproject15/servlet/CServlet

B.超链接方式
<a href="servlet/CServlet?username=zhangshan&pwd=123456789">链接</a>

C.include或者forward标签
<jsp:forward page="servlet/CServlet?username=wangwu&pwd=123456"></jsp:forward>

D.javascript转向
<input type="button" value="点击"
onclick="location.replace('servlet/CServlet?username=abcd&pwd=123');">

E.response转向

9,在web服务器中配置errorpage

<error-page>
<error-code>500</error-code>
<location>/index.html</location>
</error-page> <error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/index.html</location>
</error-page>

10.关于session-config的配置

<session-config>
<session-timeout>1</session-timeout>
</session-config>

超时时间单位为分钟

11.为servlet定义初始化参数
使用getInitParameter()方法来提取servlet的初始化参数

定义:

<servlet>
<servlet-name>a</servlet-name>
<servlet-class>com.sun.demo.MyServlet</servlet-class>
<init-param>
<param-name>type</param-name>
<param-value>text/html;charset=GBK</param-value>
</init-param>
</servlet>

提取方式:
String str = this.getInitParameter("type");

12.过滤器:
在到达目标页面之前,所处理的动作
作用:
权限的校验
日志记录
图片的转换
数据的加密
等等.

实现步骤:
1).实现Filter接口
2).实现doFilter方法
3).传递过滤链,放请求过去
4).在web.xml文件中注册过滤器

13.监听器
靠事件来触发的,比如application执行了setAttribute();

步骤
两步:
A.实现listener接口,说出你想要做什么
B.在web.xml文件中注册这个监听器

14.字符集转换的问题

分几类情况
A.如果页面中使用jsp:include或jsp:forward关系,中文字符集转换:
request.setCharacterEncoding("GBK");

B.在servlet中显示中文:
由于无法使用jsp页面中的编码指令
<%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>

那么在servlet中设置输出编码就应该通过:
response.setContentType("text/html;charset=GBK");

C.普通的参数传递
普通的参数也需要考虑到中文的问题
除了页面显示设置 contentType="text/html;charset=GBK"之外,我们还需要对中文字符进行字符转换硬编码

超链接:
String str = request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");

form表单:
String str= request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");

javascript转向:
String str = request.getParameter("username");
str = new String(str.getBytes("ISO8859-1"),"gbk");

response方式转向:
String message = "我的中文测试";
response.sendRedirect("L.jsp?message="+URLEncoder.encode(message));

接收页面:
String message = request.getParameter("message");
message = new String(message.getBytes("ISO8859-1"),"GBK");

request等作用域
request.setAttribute("username","我的测试名称");
session.setAttribute("passwd","我的密码");
不需要进行转换

15.编写线程安全的servlet

java线程共享数据的概念
多线程使用的数据是共享的

boolean shutdown = true;

/**
* 线程体
*/
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (1 == 1) {
i++;
System.out.println(Thread.currentThread().getName()+"="+i);
if (shutdown == false) {
break;
}
}
System.out.println("本线程结束!");
}

servlet本身建立在多线程的基础上,所以对于全局变量也存在"共享数据"的问题.

在servlet中定义一个全局变量,该数据将会被多个线程"共享",

String username;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
username = request.getParameter("username");//张三 try {
Thread.sleep(1000*6);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.println(username);
out.close();
}

如果同时提交两个请求:
http://localhost:8088/myproject19/servlet/AServlet?username=zhangshan
http://localhost:8088/myproject19/servlet/AServlet?username=smith
则:
两个结果都将显示为smith

这是因为第一个在访问时,得到了zhangshan的值,后来,username的值被赋为smith
又因为username是被多个线程所共享的,所以,所有请求里面的username都变成了smith

避免使用全局变量
方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全

16.怎么样自动加载servlet
我们知道,servlet有一个生命周期方法,init,service,destroy,其中init在servlet第一次访问的时候访问,它只能被访问一次.
如果你需要在服务器启动时,让servlet自动启动,你可以通过load-on-startup来实现,这一点,我们可以通过init方法被调用来观察出来

load-on-startup是web.xml文件中servlet的配置节点

描述我们的场景:
假如你有这样一个需求:
为提高系统性能,在服务器启动时,从数据库中查询所有的用户名列表,以便在其他页面中可以直接使用,而不需要从数据库再进行查询,如何实现?
A.ServletContextListener可以在服务器启动时自动执行其方法
B.可以使用一个servlet,然后定义load-on-startup,让它能够在服务器启动时自动执行其方法

使用<load-on-startup>1</load-on-startup>可以指定服务器加载顺序

实例代码:

/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
* 本方法在servlet被加载时访问
* 这里,我们在服务器启动,自动加载一段数据,起到数据缓存的效果
*/
public void init() throws ServletException {
// Put your code here
List<String> list = new ArrayList<String>();
list.add("WARD");
list.add("JONES");
list.add("JAMES");
this.getServletContext().setAttribute("datalist",list);
}

配置文件设置:

<servlet>
<servlet-name>DataCacheServlet</servlet-name>
<servlet-class>com.sun.demo.DataCacheServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

后记:每一天,每一动作,我们所尝试过经历过的,都是辽阔夜空里微微闪烁的星光,即使微茫,

也有人站在某个角落用闪烁的眸光与你辉映!

web开发技术中Servlet技术的概述的更多相关文章

  1. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  2. 【Java Web开发学习】Servlet、Filter、Listener

    [Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...

  3. Web开发底层是Servlet

    SpringMVC:是基于spring的一个框架,实际上就是spring的一个模块,专门是做web开发. 可以理解成servlet是一个升级 web开发底层是servlet,框架是在servlet基础 ...

  4. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  5. 做web开发需要学习哪些技术--基础篇

    做一个web网站,包含哪些技术,自己需要学习哪些技术 自己想到哪里就写到哪里 -- 给自己做的一个记录 1: 页面的展示, 一个web的开发语言  1.1 一个web的开发语言需要注意哪方面,才能符合 ...

  6. 初学 Java Web 开发,从 Servlet 开发

    1. 基本要求:Java 编程基础 有良好的 Java 语言编程基础,这是必须的,在讨论 Web 开发技术时提了一个 Java 编程基础的问题会被鄙视的. 2. 环境准备 (Eclipse + Tom ...

  7. java web 开发入门 --- tomcat/servlet/jsp

    在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...

  8. 【Web】CGI与Servlet技术对比

    CGI:Common Gateway Interface,通用网关接口. 1.CGI处理步骤 首先,客户端(即Web浏览器)根据某资源的URL向Web服务器提出请求:Web服务器的守护进程(HTTP ...

  9. 关于Ajax技术中servlet末尾的输出流

    Ajax的服务器端用PrintWriter out=resp.getWriter()来响应数据的时候,out.print(0).out.print(1)来表示成功或失败,而不用out.write是有原 ...

随机推荐

  1. Erlang常用代码段

    十六进制字符串转为二进制 hex_to_bin(Bin) -> hex2bin(Bin). hex2bin(Bin) when is_binary(Bin) -> hex2bin(bina ...

  2. 一个可以直接使用的MsgBox基于form居中API

    可直接复制DialogBox项目(文件夹)到需要的项目中然后直接引用和using CodeProject.Dialog 已修正原作者代码错误的地方,可直接使用,VS2010测试成功 具体可以参考案例T ...

  3. javaproject积累——java 反射 invoke

    铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...

  4. Google Hacking的实现以及应用

    Google Hacking其实并算不上什么新东西,在早几年我在一些国外站点上就看见过相关的介绍,但是由于当时并没有重视这种技术,认为最多就只是用来找找未改名的mdb或者别人留下的webshell什么 ...

  5. Qt的SQL操作,DELETE,SELECT

    #include <QObject> #include <QSqlDatabase> #include <QSqlError> #include <QSqlQ ...

  6. Node填坑教程——简易http服务器

    我们这一期做一个简易的http服务器. 先建一个文件夹,就算是一个空的项目了.然后新建app.js和package.json文件. 这样一个简易项目的基本文件就建好了. 通过命令行工具,在项目路径下输 ...

  7. 在现有代码中通过async/await实现并行

    在现有代码中通过async/await实现并行 一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇“黑色 ...

  8. 使用with ties查询并列的数据

    select top 1 with ties name,stuId,sex,score from stuInfo order by score desc

  9. ASP.NET开发大杂烩

    ASP.NET开发大杂烩 正巧今天遇到一个获取动态生成table中的一个动态生成的TextBox的值的时候总是findcontrol不到.后来经过我们的徐总,瞬间解决,但是我觉得对于一个页面的声明周期 ...

  10. thinkphp空操作和配置文件实现简化路由

    1关于TP中空操作和路由问题 <?php function test(){ $content="test demo @云峰天下"; $pattern='/@(\S+)\s/' ...