Servlet

一、什么是Servlet

Servlet 是由SUN公司提供的一门动静Web资源开发技术(标准,接口)动态Web资源: 不同的人去拜访看到的成果都是雷同的    HTML/css/js等动静Web资源: 在不同的条件下看到的是不同的成果    Servlet/JSP/.NET/PHP等Servlet是实质上是一个Java程序,但和咱们之前接触的Java程序不同的是,Servlet无奈独立运行(Servlet中没有main函数)须要将Servlet程序放在服务器中,由服务器调用才能够执行!运行在服务器中的Servlet程序作用是: 对服务器接管的申请进行解决(解决申请)

二、开发Servlet程序
1、开发Servlet程序的步骤

1)写一个类,须要实现一个Servlet接口或者继承Servlet接口的子类    Servlet      |-- GenericServlet 实现了Servlet接口,并实现了其中的办法                  |-- HttpServlet 继承了GenericServlet,也实现了其中的办法    在开发时,咱们只须要继承HttpServlet,并继承其中的办法即可!2)在web.xml文件中配置Servlet对外拜访的门路,再将Web利用公布到服务器即可!

2、通过Eclipse创立一个Web利用

注意事项:1)Dynamic Web Version:抉择2.5版本,因为2.5版本之后是通过注解配置Servlet,    注解配置Servlet是变简略了,然而不好了解,因而咱们抉择2.5版本,    应用xml配置Servlet(xml配置Servlet的信息不必咱们手写,会主动生成!)    2)Web我的项目举荐应用 Package Explorer 关上, 不要应用 Project Explorer!!3)Web我的项目在Eclipse中的目录构造    CGB-Servlet-01(We我的项目)        |-- src: 其中用于寄存java源文件(xx.java),也能够放配置文件(xml/properties)        |-- build/classes: src源码目录中的货色通过编译后,会放到classes目录下        |-- WebContent: 是Web利用的根目录,其中能够寄存动态Web资源文件、                    编译后的class文件、Web利用所依赖的jar包、web.xml文件等                |-- WEB-INF                      |-- lib: Web利用所依赖的jar包                      |-- web.xml: web利用的外围配置文件(配置Servlet等)

2、运行Servlet程序

第一种运行形式:     间接在要运行的文件(html/jsp/servlet等)上-->右键-->Run as-->Run On Server,eclipse会帮咱们做如下几件事儿:1)将Servlet所在的Web我的项目(CGB-Servlet-01)公布到服务器中2)再启动tomcat服务器3)最初关上浏览器,在地址栏输出门路去拜访这个ServletEclipse默认用内置浏览器去拜访Servlet,然而这个内置浏览器有bug,最好是应用本地的浏览器去测试!第二种运行形式: 能够本人手动将我的项目公布到服务器、启动服务器、关上浏览器输出地址进行拜访!

3、Servlet在web.xml文件中的配置

全限定类名(全类名): 包名.类名 或者 包名.接口名 <servlet>        <servlet-name>HelloWorld</servlet-name>    <servlet-class>com.tedu.HelloWorld</servlet-class></servlet><servlet-mapping>    <servlet-name>HelloWorld</servlet-name>    <url-pattern>/HelloWorld</url-pattern></servlet-mapping>1)每创立一个Servlet,eclipse会帮咱们生成至多8行配置信息    这8行配置信息由一个Servlet标签和一个servlet-mapping标签组成    这两个标签中的<servlet-name>标签中的内容统一,决定了它俩是一组配置2)<servlet-class>标签中配置的以后Servlet类的全类名(包名.类名)    未来服务器依据拜访门路找到这个全类名,再利用反射+全类名能够获取以后Servlet类的实例    3)<url-pattern>标签中配置了外界该通过什么门路来拜访以后Servlet。    也就是说,这里配置什么门路,外界就得通过什么门路来拜访这个Servlet!注意事项1: Servlet在Web.xml文件中的配置信息是在创立Servlet时,Eclipse帮咱们生成的    如果Servlet不是通过Eclipse创立(比方是复制过去的),Eclipse不会生成Servlet    配置信息, Servlet没有配置信息是无法访问的(应用注解开发除外)!注意事项2: 如果不晓得什么起因,tomcat服务器启动失败了,能够将Eclipse创立的Server删除,    再从新创立一份(删除Server同时,也将左侧的Servers我的项目从工作空间中删除!)注意事项3: 在将tomcat和Eclipse整合之后,tomcat默认开启了热部署性能:    在批改了代码后,不必从新公布,也不须要重启服务器,就能够运行最新的成果!    (如果是创立了新的Servlet类,或者批改了web.xml文件,则须要重启服务器,才会失效!)

4、创立Servlet3.0或以上版本的我的项目

在Servlet3.0的我的项目中,没有web.xml文件,无奈通过xml文件配置Servlet信息而是通过注解形式配置Servlet相干信息@WebServlet("/SecondServlet")public class SecondServlet extends HttpServlet{}在@WebServlet这个注解内容所配置的内容就是(xml形式)url-pattern中配置的拜访门路另外服务器通过扫描注解定位到以后这个Servlet,获取该类的全门路,通过全门路从硬盘上加载这个类到内存中,获取该类的字节码对象,再利用反射+字节码对象创立该类的实例!

5、如何配置eclipse在右键-->run as运行一个Web资源之后,用本地的浏览器拜访测试

点击Window --> Web Browser --> 如果右侧有 Chrome 或者 Firefox 抉择其中的一个如果没有 chrome 或者 firefox, 能够抉择 Default System...,即零碎默认浏览器

Request

一、Request和Response介绍

当浏览器向服务器发申请,服务器在调用Servlet的service办法解决申请之前,会创立代表申请的Request对象,和代表响应的Response对象。将这两个对象传递给service办法,在service办法解决申请的过程中,如果要获取申请信息,能够通过request提供的办法进行获取;如果要向浏览器响应数据,能够将数据先写入到response缓冲区,等service办法执行完结,服务器会主动到response对象中获取到要发送给浏览器的数据,依照Http协定的格局将数据发送给浏览器。

二、Request罕用性能
1、获取申请参数
1.1.什么是申请参数?

所谓的申请参数就是浏览器在发送申请时,带给服务器的数据。例如:在地址栏URL地址的前面能够通过问号拼接参数,将数据带给服务器    http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu也能够通过表单,将数据写入表单项中,通过提交表单将数据带给服务器无论通过哪种形式带参数给服务器,参数都能够有多个,多个参数之间用&分隔,每一个参数都蕴含参数名和参数值

1.2.如何获取申请参数?

http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu&like=zuqiu1)request.getParameter(String paramName) -- 返回String字符串-- 通过申请参数的名字,获取对应的参数值。比方传入"user",返回"zhangsan"-- 如果获取的参数有多个值,该办法只会返回第一个值,比方传入"like",只返回一个"lanqiu"-- 如果获取的参数是不存在的,该办法会返回null,比方传入"uesr",此时会返回null值2)request.getParameterValues(String paramName) -- 返回String[]数组-- 通过申请参数的名字,获取对应的所有参数值组成的数组。比方传入"like",返回    {"lanqiu", "zuqiu"}-- 如果获取的参数值只有一个,该办法依然返回一个数组,比方传入"user",返回 {"zhangsan"}--  如果获取的参数是不存在的,该办法会返回null,比方传入"uesr",此时会返回null值

1.3.如何解决在获取申请参数时呈现的中文乱码问题?

GET提交参数是通过URL地址前面拼接参数,将参数提交给服务器POST提交参数是通过申请实体将参数提交给服务器服务器在接管GET提交的参数时,默认应用UTF-8来进行接管(浏览器提交参数用的也是utf-8),因而获取GET提交的参数没有问题。但服务器在接管POST提交的参数时,默认应用iso8859-1来进行接管,而这个编码中没有中文字符,因而在接管中文数据时,会呈现乱码问题。解决办法是:告诉服务器接管POST提交的参数时,也通过utf-8来进行接管    request.setCharacterEncoding("utf-8");留神:这行代码要放在获取参数的代码之前执行!    这行代码只对POST提交失效,GET比拟不受任何影响!

2、实现申请转发

所谓的申请转发是服务器外部资源之间的跳转形式(从一个资源跳转到另外一个资源)申请转发(forward)的特点:1)转发是一次申请一次响应2)转发前后地址栏地址不会发生变化3)转发只能在同一个Web利用外部两个资源之间进行跳转4)在转发的两个资源之间能够利用request域(map)传递数据申请转发的实现代码:    /* 将申请转发到 TestForward2      * TestForward2: http://localhost:8080/CGB-Servlet-03/TestForward2     * 因为服务器会在转发的门路后面主动的拼上我的项目门路, 因而咱们在传门路时,      * 只须要传我的项目门路前面的门路, 我的项目门路及之前的门路不传     */    request.getRequestDispatcher( "/TestForward2" )                .forward( request, response );

3、作为域对象应用(须要配合转发)

在申请转发时,会将request对象传递给所转发的资源(A--转发-->B,会将A中的request传递给B)能够在转发之前,往request的map中存入数据,再转发,因为转发时会将request带到所转发的资源在转发的资源中,能够通过request将map中携带的数据再取出来!在ServletA中,往request的map中存入数据:    request.setAttribute(String name, Object value);    //将申请转发到ServletB    request.getRequestDispatcher("ServletB的门路").forward(req,res);在ServletB中,能够通过request将map中的数据取出来:    request.getAttribute(String name);

Response

1、实现申请重定向

申请重定向(Redirect)的特点:1)重定向是两次申请两次响应2)重定向前后地址栏地址会发生变化3)进行重定向的两个资源没有限度,能够是同一个Web利用,也能够是不同的Web利用甚至能够是不同的服务器4)在重定向的过程中不能够通过request的map汇合带数据到目的地实习申请重定向:    response.sendRedirect("所重定向到资源的地址");实现定时刷新:    response.getWriter().write("<h1>祝贺您注册胜利,5秒后将会跳转到登录页面...</h1>");    response.setHeader( "Refresh", "5;url=http://localhost:8080/CGB-Servlet-03/login.html" );    定时刷新和重定向的特点简直统一,惟一区别就是,重定向(转发)都是立刻跳转,两头没有任何工夫距离,定时刷新能够指定多少秒之后再进行跳转, 在跳转之前, 能够输入信息提醒用户(例如注册胜利后的提醒:祝贺您注册胜利,5秒后将会跳转到登录页面...)