HTML_day4(servlet的学习)
一、Myeclipsed的介绍:
1、dubug功能:与C语言的dubug使用方法相似。
2、junit:单元测试
(1)功能:用于测试类中的方法。
(2)测试原理:猜测为宏运用的封装。
3、myeclipse配置tomcat插件
二、web体系的介绍:
1、常见的软件系统体系结构:
(1)B/S:浏览器/服务器。web运用主要是使用B/S结构
**** 应用场景:浏览器
**** 缺点:安全性较差
**** 优点:更新时,是需要编写服务器端程序。
(2)C/S:客户端/服务。
**** 应用场景:App
**** 缺点:更新时,需要将客户端与服务器端同步更新,比较麻烦。
**** 优点:安全性较高
2、web资源:
(1)静态资源:html,浏览器可以直接解读。
(2)动态资源:JavaScript(js)、servenet和其他web程序(PHP等)。浏览器不能直接解读,需要转换成html才能被浏览器解读。
3、浏览器作用:接受客户请求,并作出回应。只会解析静态web资源。
三、Tomcat服务器介绍与使用:
1、常用服务器的介绍:略
2、tomcat简介:由Apache提供,开源免费。因为sun公司等参与到tomcat的开发,所以SP/Servet的规范总是能在tomcat中体现出来。
3、tomcat不支持javaEE,既不属于EJB容器(企业级)。
4、安装路径、目录、名称等的要求:不能含有中文和空格。
5、tomcat的webapps目录用于装在项目:
(1)创建步骤:在webapps下创建目录——>在创建好的文件目录下创建html文件,
(2)存放动态文件:在webapps下创建WEB-INF目录,用于存放动态文件等。也可以存放其他文件,
——WEB-INF下的文件不能被客户端直接访问。
——WEB-INF需要单独创建lib和classes:lib目录下存放项目源码;classes目录下存放编译器生成的.class文件。
5、tomcat外部文件的配置:当资源存在于webapps目录之外的地方,需要进行文件的配置。目的是让服务器能找到资源
(1)在server.xml内部添加内容:
——添加项目名;添加项目真实路径
· ——使用浏览器访问时,需要使用server.xml内部指定的项目名。
(2)在conf/catalina/localhost目录下添加xml文件:
——文件内容:context = 真实路径
——使用浏览器访问时,使用文件名。
6、虚拟机配置:略
7、server.xml源码的解读:未整理
8、httpWatch:一款通信内容解读插件,专用于IE浏览器。
(1)作用:用于解读客户端与服务器端之间的通信。
(2)使用原因:网页呈现的源码只是信息传输的正文部分,它对请求头进行了隐藏。而httpWatch可以看到通信的全部信息。
10、常用请求体:
(1)GET:有空行,但没有方法体。
(2)POST:有空行,有方法体。
(3)Referer:提示请求来自哪一个界面。
——应用场景:统计访问量;防止链接盗用。
11、常用响应码:
(1)200:请求成功。浏览器会把响应体内容显示在页面上。注:通常以2开头的响应码都属于响应成功。
(2)404:请求的资源没有找到,说明客户端错误的请求了错误的资源。注:属于客户端错误。
(3)500:请求的资源找到,但服务器内部出现了错误。注:属于服务器端错误
(4)302:重定向。表示服务器要求浏览器重新再发送一个请求,服务器会发送一个响应头location,他指定了新请求得的url地址。
(5)304:如果当前请求的内容属于浏览器缓存内容,且与上一次请求的的内容相同,服务器会相应304,并且不会相应正文,表示浏览器缓存的就是最新版本缓存。注:减少缓存内容的重复写入与读取,提高了响应效率。
——在html中,可以只用meta模拟响应头。
四、java图片类的使用:
1、主要使用BufferImage类
2、图片验证:
(1)图片验证的作用:防止恶意注册;防止暴力破解
(2)使用java的graphics类进行图片的设计
五、servlet知识:
1、作用:servlet负责进行真正的事件处理。服务器(如tomcat)只是在获得浏览器端的请求后,负责请求事件与servlet的匹配。
(1)使用代理设计模式——服务器负责处理请求事件所产生的附加服务。
(2)servlet使用单列设计: 一个类只产生 一个对象。
(3)servlet属于线程不安全问题:浏览器的请求访问属于异步问题,每一个servlet都是唯一的,一个请求对应唯一的一个servlet,即servlet不能同时为多个请求提供服务。虽然是线程不安全的,但是效率较高。注:每一个servlet都是唯一的,且功能都不相同。
2、servlet的工作步骤:获取请求(接受请求数据)->处理请求->完成响应
3、servlet属于接口:存在于javax.servlet包,当接口被实现后,是由服务器生成和调用对象,而不是由程序员调用,实际上是由服务器和servlet共同组成来了一个完成的类。
4、servlet接口的方法:init()、service()、destroy()、servletConfig()、getServletInfor()
(1)生命周期方法:init()、sercive()、destroy()
****** init():在servlet对象创建之后马上执行,且只执行一次
****** service():每一次调用servlet都会别执行,实际也是每一次处理请示的主要方法。
****** destroy():在servlet结束之前调用,且只会被执行一次。它只是起到提示作用,并不是它销毁servlet对象。注:在这个方法中,可以用于释放servlet占用的非内存资源。但是实际上很少这样操作。
(2)另外两个方法:
***** servletConfig():用于获得servlet的配置信息。
***** getServletInfor():获得servle的信息。
5、servlet的访问:需要在web.xml中配置路径
(1)代码演示:
————————————(待插入代码)
(2)实质:创建虚拟路径标签,并与真实路径标签产生映射关系,同时都拥有相同的类名标签。当浏览器通过虚拟路径标签查找获得类名标签后,向上匹配到同名标签,然后在经过查找获得真实路径标签。注:最后服务器会根据真实路径(字符串表示的数据),然后使用反射获得servlet类。
6、servlet的相关类或接口:
(1)servletConfig接口:当使用servlet接口中的servletconfig()时,返回的就是这个接口的实列。
****** 作用:用于存储servlet的配置信息。
****** 内容:一个servletConfig对象,对应web.xml中的一个servlet的配置信息(即访问路径等)
***** servletConfig接口中的方法:用于获得servlet的 初始化参数值或名字。
——getInitParamater(String name):获得初始化参数的值。
——getInitParamaterNames():获得初始化参数的名字。注:返回的是老版的迭代器——Enumeration
——getServletContext():获得上下文(请求体)
(2)servletContext接口:它的对象用于装载servlet的上下文。
(3)servletRequest类:用于封装请求信息。
(4)servletResponse类:用于封装响应信息。
7、genericServlet抽象类:实现了servlet接口,实际是对servlet常规操作的实现,并留有扩展空间。
(1)genericServlet抽象类内部具有扩展功能的实现:当实现了servlet接口的方法后,新增带有空方法体的同名函数,方便后续子类的扩展——适配器的使用。
8、httpServet类:是对genericServlet抽象类的继承。专门用于处理http协议。
(1)参数强转:继承自genericServlet的service()方法,存在参数servletRequest和servletResponse,通过强转转换为httpServletResquest和httpServletResponse。然后调用自身重载的service()方法
(2)继承httpServlet类的特殊要求:必须覆写doget()和dopost()方法,如果没有覆写这两个方法但是类有被调用了,将会出现405错误。注:doget()和dopost()用于获取客户端的请求方式。
9、解决servlet的线程安全问题:核心是不产生资源共享。
(1)不要在servlet中创建成员变量——初级用法。注:可以拥有局部变量。
(2)可以创建无状态成员——中级用法。注:将类作为成员变量,但是类变量不能拥有成员变量。
(3)创建有状态成员变量,但是只能被读取——高级用法。注:即只拥有getter方法,没有setter方法,这样外部将无法对内部变量进行修改。
9、配置文件知识:conf下的web.xml是所有的web.xml的超类。如果一个servlet没有被配置信息,当使用浏览器访问时,会默认调用conf下的web.xml,并使用默认访问方式。注:conf下的web.xml指的是/tmocat/conf/web.xml。其他web.xml指的是/tomcat/webapss/项目名/WEB-INF/web.xml。
10、servlet对反射的运用:通过虚拟路径获得真实路径,并最终获得类
(1)首先获得<servlet—mapping>标签下的子标签获得类名,然后通过向上匹配,在所有<servlet>标签下获得同名类标签,随后获得真实路径,最终通过反射获得类。注:这一列操作是由服务器完成。同时可以使用socket模拟简易的服务器。
11、servletContext:javaweb四大域对象之一。
——域对象:用于在多个servlet对象中传递数据。所有域对象都具有存取数据的功能,因为域对象内部都具有一个map。
(1)一个工程项目对应一个servletContext对象。
(2)一个servletContext对象可以被多个servlet调用。注:因为他负责servlet之间的通信。
(3)可以配置公共的参数为所有的servlet使用。注:不同于servlet的初始化参数,每一个servlet的初始化参数只能用于自身。
(4)可以通过ServletContext获得某个文件的真实路径:getRealPath()。 注:也可以直接获取某个文件的流操作。
(5)生命周期:在服务器(如tomcat)启动时创建,在服务器关闭时销毁。
12、classLoader类:用于读取src目录下的资源文件。注:实际上src下的每一个资源文件都会被拷贝放置在WEB—INF下的classes中
(1)classLoader类的参数路径是相对与classes目录,而class类的参数路径是相对于当前的.class路径。
(2)当资源文件与项目文件在同一目录下时,使用class类同样可以读取,但是当放置在目录之外,则不能直接使用路径名读取。
——当使用class(/文档名),class的读取路径变成了相对于classes目录,此时功能等同于classLoader。
六、服务器对处理请求:
1、处理流程:
(1)服务器每一次收到请求时,都会为这个请求开辟一个新的线程。
(2)放服务器会把客户端的请求数据封装到resquest对象中,request就是请求对象的载体。
(3)服务器还会创建reponse对象,每一个response对象会与一个特定的客户端绑定在一起,它可以用来向客户端发送响应。
2、reponse响应头:
(1)每一个响应头都是一个键值对。
(2)在处理响应时,IO流中的servletOutputStream与printWrier只能使用一个。否则会抛出异常。
——使用fileOutputStream一次性读取时,需要指定byte数组的大小。byte数组的大小可以由文件本身决定:file.length
3、快捷重定向:在处理302问题时,servlet需要反馈响应码302和设置响应头location。注:location用于指定再访问的地址.
(1)sendRedirect():此方法是对原始操作的封装。函数原型:sendRedirect(String location)。注:它与重定向仍有不同之处,它对访问方式有所限制。
解释链接:https://www.cnblogs.com/qiumingcheng/p/4928289.html
4、request请求:可以通过request请求获得请求的响应头和响应体。
(1)请求转发和包含:当一个请求需要多个servlet协作完成时,使用请求的转发和包含。通过getRequestDisparter()方法获得调度器。
—— forward():用于请求转发。被转发的servlet可以设置响应头,但响应体无效。只会执行转发后的servlet的响应体,简称留头不留体。通常在请求转发中,原servlet不作任何请求。
—— include():用于请求包含。原servlet既可以设置响应头,也可以设置响应体。
(2)设置响应体的编码:对于Post请求,可以直接通过相应的方法进行设置。对于Get请求,可以在server.xml内配置默认的编码方式,但此操作移植性很差,因为只是改变了自己tomcat的解码方式。也可以通过反编码的方式获得原始的编码内容,然后再转换为UTF-8。注:客户端编码方式一般为ISO-8859-1,在中国,服务器解码方式一般为gbk。同时,服务器会自动识别URL编码,并进行解码。例如表单标签的内容就会自动生成URL编码。
(3)总结:主要接触了响应头,响应体的设置;请求的特殊处理,如重定向,请求的转发和包含;响应体的编码和解码方式,重点在于URL编码的转换和post请求与get请求的区别。
(4)路径的区别:
》在请求转发和包含中:使用"/"开头,是相对于当前的项目路径;不使用"/"开头,则相对于当前的servlet路径。
》重定向路径:使用"/"开头,相对于当前的主机,,需要自己手动添加项目名。
》页面中的超链接和表单标签:使用"/"开头,相对于当前的主机,表示的是绝对路径;不使用"/"开头,则相对于当前页面的路径,属于相对路径,可移植性差。
》ServerContext获取资源路径:相对于当前的项目目录,即当前index.jsp所在目录。
》ClassLoader:不使用"/",相对于classes目录。
》Class:使用“/”开头,相对于classes目录,与ClassLoader功能相同;不使用“/”开头,则相对于.class文件所在目录。
5、属性与参数的区别:attribute,parameter
(1)来源不同:参数来源于客户端(如表单标签),获得的方式可分为地址栏可见的get请求和地址栏不可兼得post请求。属性是服务器端的组件,通过域进行设置和获取。
(2)操作方式不同:参数只能读取不能被修改;属性可读可改。
(3)数据类型不同:参数在前台的定义不管是什么,在服务器端获取时都当做String类型对待,并且客户端的类型只能是简单类型的值,不能是对象等的复杂类型;属性的值则可以是任意的Object类型。

浙公网安备 33010602011771号