# 1. 什么是Servlet?  

sun公司制订的一种用来扩展web服务器功能的组件规范。

## (1) 扩展web服务器功能(servlet的产生背景)
       web服务器只能处理静态资源的请求(即需要事先将html文件及相关的图片等资源准备好),不能够处理动态资源的请求(即需要计算,生成相应的html),所以,需要扩展web服务器的功能。
       Servlet可以扩展web服务器功能,当web服务器收到请求之后,可以调用Servlet来处理动态资源的请求。

## (2) 组件规范
组件是什么?
      符合规范,实现部分功能,并且需要部署到相应的容器里面才能运行的软件模块
      Servlet是一个组件,需要部署到Servlet容器里面才能运行。

容器是什么?
      符合规范,提供组件的运行环境的程序。
      apache tomcat就是一个Servlet容器,提供Servlet运行环境(即网络相关的服务)。

2. 如何写一个Servlet?
step1. 写一个java类,实现Servlet接口或者继承HttpServlet抽象类。
step2. 编译。
step3. 打包。
即创建一个具有如下结构的文件夹:
appname (可自定义) 
WEB-INF
classes (放.class文件)
lib (放.jar文件  可选)
web.xml (部署描述文件)
step4. 部署。
将step3创建好的整个文件夹拷贝到相应的Serlvet容器里面。
注:
将step3创建好的整个文件夹使用jar命令压缩成".war"结尾的文件,然后再拷贝。
step5. 启动Servlet容器,访问Servlet。
http://ip:port/appname/url-pattern

3. Servlet是如何运行的?
比如,在浏览器地址栏输入
http://localhost:8080/day01/hello

step1.浏览器依据ip和port建立连接。
step2.浏览器将请求相关的数据打包(即创建请求数据包)然后发送给servlet容器。
step3.servlet容器解析请求数据包,并且将解析到的数据存放到request对象里面,同时,还会创建一个response对象。
step4.servlet容器依据请求路径找到对应的servlet的配置,然后容器将servlet实例化。
step5.servlet容器调用servlet的service方法。
注:
      会将request和response作为参数传递进来,开发人员可以调用request对象的方法来获得请求数据包里的数据(比如获取请求参数值),也可以将处理结果写到response对象里面。
step6.容器从response对象中取出处理结果,然后创建响应数据包并发送给浏览器。
step7.浏览器解析响应数据包,生成相应的页面。

4. 常见问题
## (1)404
含义:
404是一个状态码,表示依据请求路径找不到对应的资源。
原因:
a.请求路径写错。
应该按照 http://ip:port/appname/url-pattern来写。
http://localhost:8080/day01/hello
b.没有部署或者部署失败。

## (2)500
含义:
服务器运行出错。
原因:
a.没有严格按照规范来写Servlet,比如
没有继承HttpServlet,又比如,部署描述文件中的类名写错等等。
b.代码不严谨,比如对请求参数没有做检查就做类型转换的处理。

## (3)405
含义:
找不到处理方法。
原因:
容器找不到service方法来处理请求。

5. Servlet输出中文要注意什么?
## (1)为什么会有乱码?
out在输出时,默认会使用iso-8859-1来编码。所以,
对于中文,会产生乱码。
## (2)如何处理?
response.setContentType(
"text/html;charset=utf-8");

# 练习:写一个DateServlet,输出当前的系统日期。

比如,http://localhost:8080/day01-lab/date

## step1.建maven工程。
注意:war包。

## step2.生成部署描述文件。

## step3.指定服务器。

## step4.添加一个java类。(DateServlet)
继承HttpServlet,并且override service方法。

public class DateServlet extends
HttpServlet{

@Override
protected void service(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException {
response.setContentType("text/html");
PrintWriter out =
response.getWriter();

Date date = new Date();
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
out.println(sdf.format(date));
out.close();
}
}

## step5.在web.xml文件里面,配置Servlet。

<servlet>
      <servlet-name>dateServlet</servlet-name>
      <servlet-class>web.DateServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>dateServlet</servlet-name>
      <url-pattern>/date</url-pattern>
    </servlet-mapping>

## step6.部署并运行。

servlet之一(概念/如何写/运行/错误提示/乱码处理)的更多相关文章

  1. eclipse运行错误提示 Failed to load D:\Android\sdk\build-tools\26.0.0-preview\lib\dx.jar

    前几天在ecplise上运行项目还好好,今天一运行就提示这个错误:Your project contains error(s), please fix them before running your ...

  2. android------eclipse运行错误提示 Failed to load D:\Android\sdk\build-tools\26.0.0-preview\lib\dx.jar

    更新了SDK后,在ecplise上运行项目时出现了一个问题. 一运行就提示这个错误:Your project contains error(s), please fix them before run ...

  3. wamp下mysql错误提示乱码的解法

    出处:http://blog.csdn.net/jsship/article/details/42914217 运行mysql命令时,出现的错误提示是乱码 :    [Err] 1064 - Erre ...

  4. pycharm 运行错误信息显示乱码

    pycharm版本 解决方法:

  5. sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类

    sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类 详述 使用sbt对写的Spark程序打包,过程中没有问题 spark-submit提交jar包运行提示找不到对应的类 解 ...

  6. 运行js提示库没有注册错误8002801d的解决办法

    运行js提示库没有注册错误8002801d的解决办法这个错误主要是因为服务器上的windows scripts版本较低,请按下面的链接下载较高版本windows scripts 5.6并在服务器上进行 ...

  7. 解决Asp.net中的Chart控件运行出现错误提示“ ChartImg.axd 执行子请求时出错”

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABTkAAAJwCAIAAADN5fIdAAAgAElEQVR4nOzdfZAc1X3o/VNFlbcoJf

  8. Android JNI 编译正确 但是提示程序有错误无法运行 而且还看不到任何错误提示 的解决方法

    前几篇中一直在通过Android做JNI调用,关于JNI的配置请见:http://blog.csdn.net/watkinsong/article/details/9849973 但是前一段时间就遇到 ...

  9. 解决IIS7运行ASP提示错误:An error occurred on the server when processing the URL. Please contact the system administrator

    原文:解决IIS7运行ASP提示错误:An error occurred on the server when processing the URL. Please contact the syste ...

随机推荐

  1. java 中静态变量(类变量)与实例变量 静态方法与实例方法

    静态变量: 在类内部中,方法的外部声明的对象而且加上static; 实例变量: 在类内部中,声明不需要加static; 比如: public class Demo{ int i1=0; static ...

  2. Win_Server_2008 安装 Oracle_11g EM时上载EM资料失败

    此问题本人也遇到过.在网上找到了解决方案.下部分引用IT PUB. 安装oracle11g 64位.创建数据库到快结束的时候,报告说EM无法创建.emca_2010_06_13_11_05_36.lo ...

  3. bzip2 zip 压缩后体积比 0.8:1

    1. 对.bz2 后缀文件 跳过不处理 2.逐行同字段的json文件,压缩后大小为原文件的12.81% 测试文件近似认为为逐行json文本数据,没有进行多文件重复测试,没有统计时间: {"u ...

  4. 审核被拒绝。附近??Guideline 5.1.2

    5. 1.2 Legal: Privacy - Data Use and Sharing Guideline 5.1.2 - Legal - Privacy - Data Use and Sharin ...

  5. 洛谷P1083 借教室 NOIP2012D2T2 线段树

    正解:线段树 解题报告: ...真的不难啊只是开了这个坑就填下? 就是先读入每天的教室数建个线段树然后每次读入就update一下,线段树存的就这一段的最小值啊,然后如果有次更新完之后tr[1]小于0了 ...

  6. dbms_stats.gather_table_stats详解

     dbms_stats.gather_table_stats 统计表,列,索引的统计信息(包含该表的自身-表的行数.数据块数.行长等信息:   列的分析--列值的重复数.列上的空值.数据在列上的分布情 ...

  7. 发现《深入理解C++11》中扩展的friend代码的错误

    目前在总结现代C++的新特性,看了<深入理解C++11>这本书. 今天看到扩展的friend语法这一节,遇到了问题.本节电子版内容参见:https://book.2cto.com/2013 ...

  8. 搭建私有yum仓库

    需要工具: centos7 nginx rsync 新建文件夹存放镜像数据 mkdir /data mkdir /data/yum_data 同步数据 国内开源镜像站没有几个支持rsync,科技大学的 ...

  9. 安恒X计划12月月赛

    ezweb 主要是序列化问题.没有PHP环境,在线运行的.实例化对象之后修改一下file.然后echo输出序列化的结果.不过下面有一个正则检查.数字前加一个+,影响了正则的匹配,但是对于序列化的还原没 ...

  10. [LeetCode] 168. Excel Sheet Column Title_Easy tag: Math

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...