servlet 简介
1.servlet叫什么
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet值用来扩展基于HTTP协议的WEB服务器。
2.servlet是什么
java Servlet 是运行在web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。
3.Servlet架构
下图显示了 Servlet 在 Web 应用程序中的位置。
4.Servlet包
Java Servlet 是运行在带有支持Java Servlet 规范的解释器的web服务器上的Java类
5.Servlet生命周期
init()->service(){doget() dopost() 等}-> destroy()
如果有service()被重写则就不会调用 doget()/dopost()
浏览器关闭不会调用destroy(),这有服务器关闭才会关闭destroy()
6.中文乱码问题
注意:如果表单提交的数据中有中文数据则需要转码:
String name=newString(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
7.Servlet异常处理
当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的web.xml中搜索与抛出异常类型相匹配的配置。
您必须在 web.xml 中使用error-page元素来指定对特定异常或 HTTP状态码作出相应的 Servlet 调用。
8.<load-on-startup> ? </load-on-startup>
只要不为0或者不为空,就是表示启动的时候执行
9.乱码问题
首先为什么会出现乱码呢?
解决get乱码问题。。因为,我们在提交数据的时候是UTF-8类型的数据 而是通过数据流的形式到doget,那么数据流tomcat设置的是ISO-8859-1 的字符形式。所以自然就出现乱码现象。那么怎么解决呢?首先到tomcat的server.xml中<Connector>中设置 URIEncoding="UTF-8"。就可以解决get请求的方法。但post的请求改变不了。
解决post乱码问题。在dopost中加一个 request.setCharacterEncoding("UTF-8");。
以后编程的时候都是用过滤器来解决乱码问题。
问题笔记。
1.如果没设置web.xml内容可以,web项目可以打开吗?
可以,但必须要头标签,因为创建web.xml必须有xml标记头,要不然找不到默认的启动网页。
参考网页(http://www.cnblogs.com/hxsyl/p/3435412.html)
2.如果没创建web.xml,web可以运行吗?为什么?
可以。因为对于tomcat来说,当你只指定一个web的根名,没有指定具体页面,去访问时一个web时,如果web.xml文件中配置了欢迎页,那么就返回指定的那个页面作为欢迎页,而在文中没有web.xml文件,或虽然有web.xml,但web.xml也没指定欢迎页的情况下,它默认先查找index.html文件,如果找到了,就把index.html作为欢迎页还回给浏览器。如果没找到index.html,tomcat就去找index.jsp。找到index.jsp就把它作为欢迎页面返回。而如果index.html和index.jsp都没找到,又没有用web.xml文件指定欢迎页面,那此时tomcat就不知道该返回哪个文件了,它就显示The requested resource (/XXX) is not available(我就出现过这个问题)的页面。其中XXX表示web的根名。但如果你指定了具体页面,是可以正常访问的。
参考网页(http://www.cnblogs.com/hxsyl/p/3435412.html)
3.web.xml 配置文件的加载顺序是什么?
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资 料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只 是略加点了自己的修饰。 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会 因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -> filter -> servlet 。如果某个会话在一定时间内未被访问,服务器可 以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对 象的超时值,或者可利用session-config元素制定缺省超时值。
参考网页(http://www.cnblogs.com/hxsyl/p/3435412.html)
4.请求servlet容器时候,servlet servlet-mapping 的顺序?
摘录某个工程的 web.xml 文件片段:
访问顺序为1—>2—>3—>4,其中2和3的值必须相同。
url-pattern 标签中的值是要在浏览器地址栏中输入的 url,可以自己命名,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 标签的值必须相同,因为通过 servlet 标签中的 servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 class。
还有,web.xml 的 / 表示的是http://localhost:8080/ + 工程名
而.jsp页面的action,加了/表示绝对路径http://localhost:8080/ ,没有加
/ 表示的是相对路径
5.url-pattern 的匹配顺序规则?
1. 写法
①完全匹配:以“/”开头,以字母(非“*”)结束
如:/test/list.do
②目录匹配:以“/”开头且以“/*”结尾
如:/test/*
/*
③扩展名匹配:以“*.”开头,以扩展名结束
如:*.do
④ “/” 用来表明对应的Servlet为应用默认的Servlet。在这种情况下Servlet路径是请求的URI去掉上下文路径并且路径信息为null。
2. 匹配过程
当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:
1. 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
2. 最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action
4.如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源(问题7)。如果应用定义了一个default servlet,则容器会将请求丢给default servlet
=================================================
参考网页(http://tianya23.blog.51cto.com/1081650/1001568)
6.请求给Servlet没有匹配到,运行机制是什么样的。
有两种方式声明servlet的方式
一。
二。
7.filter过滤的顺序是怎么决定?
由 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序 。切记配置文件重写是,需要重新启动项目才能使用。
8.下图为什么不能创建HelloWorld?
因为配置过的他创建的时候eclipse会去检测,检测到已经存在同名的servlet了当然不给你创建。
9.如果只写配置文件则会报错吗?
会的。报404错误。
10.Eclipse新建Servlet时候,不会自动生成mapping到web.xml,而是在代码中加入注解@WebServlet
参考文章(http://blog.csdn.net/xulianboblog/article/details/51079534)
因为查找文档发现,这是Servlet3.0新特性(得Tomcat7.0版本及以上),@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 value 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)