从外地回来,入职了一家新的公司有一年了,毕竟是在家乡,时间过的就是快,以前做安卓和webapp,后来到新公司转成JavaWeb,一直想出一系列基础的教程,希望和小朋友们一起学习,也顺便记录自己的一路心酸,在次感谢我IT行业的引路人棋子老师,是他在我大学期间教会了我android,不然我还徘徊在R包导错的阶段,感谢我的老师是他教会了x5,感谢新公司的老倪,才知道人生的艰难,我会不定期的出一些基础的教程,主要想让大家知道整个web程序的运作流程,而不是只是会使用,我也在整理我新的项目架构,涉及到代码生成器,单点登录,权限控制。。。请大家多多交流
1.什么是Servlet
Servlet是一个运行在web服务器中的Java小程序,Servlet将会接受和响应来自web客户端的请求,使用HTTP(超文本传输协议)进行通信。
2.重要性
Servlet是所有web应用程序的核心类,它是唯一可以直接处理请求和响应用户请求,也可以将处理的请求委托给其他应用程序中的其他部分的类,除非莫些过滤器提前终止了客户端的请求。
3.servlet的生命周期最为重要的三个方法,它们每个都由servlet实现,并且在特定的时间内调用:
(1) void init(ServletConfig)
(2) void service(ServletRequest,ServletResponse)
(3) void destory()
> 1)默认的情况下,web容器的某个servlet接收到第一个请求时,就创建了servlet,也可以在web.xml中对servlet进行配置,使服务器启动的时候就创建
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.jinbei.controller.Helloservlet</servlet-class>
** <load-on-startup>1</load-on-startup>**
</servlet>
加粗的代码指示web容器在应用程序启动以后立即启动Servlet,如果多个Servlet都包含了该标签,它们按照标签内的值大小启动,越大越晚启动,如果两个或者多个Servlet都包含了该标签,并且配置都相同,则按照他么在描述文件中出现的顺序启动
2)当web容器创建完servlet,马上会调用init(ServletConfig)进行初始化,该方法在整个生命周期中只调用一次
3)初始化完成以后,可以接受客户端对请求,servlet就会被调用一次,web容器调用service方法来实现,该方法每处理一次请求就会被调用一次,可以被调用N次,因为Servlet是单例,每次服务器接受到一个servlet请求到时候,服务器便会创建一个新到线程并且调用服务,所以可能存在着一个Servlet对象可能会被多次请求在同一个时刻,这里存在着线程不安全的现象
4.Servlet 映射到Url
(1)同一个Servlet可以被映射到多个 URL上:
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/jinbei</url-pattern>
<url-pattern>/greeting</url-pattern>
<url-pattern>/helloing</url-pattern>
</servlet-mapping>
(2)在Servlet映射到URL中也可以使用×通配符,但是有两种固定的格式:
一种格式是“.扩展名”,另一种格式是以正斜杠(/)开头并且以"/"结尾,如下所示:
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>/action/</url-pattern>
</servlet-mapping>
通俗意义上来讲一般分为2种写法:
一种是精确匹配如:
>/jinbei http://localhost:8080/ProjectName/jinbei
> / xxx/jinbei http://localhost:8080/ProjectName/xxx/jinbei
另一种是模糊匹配如:
> /* http://localhost:8080/ProjectName/任意路径
> /test/* http://localhost:8080/ProjectName/test/任意路径
> .后缀名 http://localhost:8080/ProjectName/任意路径.do
(3)当第一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为作为映射url,比如访问的是http://localhost/demo/jinbei,我的应用上下文是demo,容器会将http://localhost/demo去掉,剩下的/jinbei将会拿做servlet的映射匹配
ps:不能同时的使用两种模糊匹配 比如/test/.do是非法的路径
当输入的URL有多个servlet同时被匹配的情况下 :
精确匹配优先(长得最像优先被匹配)
以缀名结尾的模糊url-pattern优先级别最低
5.HttpServletRequest的使用
. HttpServletRequest 接口是对ServletRequest的扩展,HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器的时候,HTTP请求头中的所有信息都封装在这这个对象中,通过这个对象提供的方法,可以获取http请求的详细信息 ,以下是常用的方法:
getRequestURL:返回客户端创建请求的完整路径,包含了协议(http或https),服务器的名称,端口号和服务器的路径,但不包含查询字符串,如下:
http://www.jinbei6.com/getcouponlist/getCouponssList?number=1&state=0
返回的http://www.jinbei6.com/getcouponlist/getCouponssListgetRequestURI:只返回URL中服务器的路径部分,返回的是:
/getcouponlist/getCouponssList
getServletPath:返回是用于匹配的Servlet映射的URL部分:/jinbei
getQueryString :返回请求行中的参数部分
getRemoteAddr:返回发出请求客户机的IP地址
getRemoteHost:返回请求客户机的完整的主机名
-
getMethod:得到客户机请求的方式
1)获取客户端请求头的消息方法
getheader(String name) //用来获取想要的头部信息- 获取所有头的方法
getheaders(String name)
3)获取头部信息 的名字和值
getHeadersNames()4)获得客户端请求的参数
getParameter(String) 返回参数的的单个值,如果参数是多个,getParameter将返回的是第一个值,而getParameterValues返回参数值的数组 ,如果参数只有一个将返回只有一个元素的数组,方法getParamaterMap将返回一个包含了所有参数名值对的 java.util.Map<String,String[]>,而getParameterNames方法将返回所有可用参数名字的枚举; - 获取所有头的方法