理论 第一章 javaWEB基础 1、桌面应用程序一般分为两种 B/S(Browser/Server)客户端浏览器和服务器 C/S(Client/Server)客户端和服务器端 2、WEB开发指的是 开发部署在远程服务器上的应用程序,该应用程序可以用浏览器访问 WEB应用是基于HTTP(Hyper text transfer protcol ,超文本传输协议)的 而HTTP又是基于TCP/IP协议。客户端浏览器发送相关请求(request)道远程web服务器,又 远程服务器效应然后返回请求(response)响应并传输给客户端浏览器 3、HTTP请求的方法主要有 请求行(request line) 请求头(request header) 请求体 (request body) get:直接由浏览器地址发送url(可以包含查询字符串,查询字符串有长度限制(64kb)) post:把由原来可以通过查询字符串发送到服务器上的数据改为http请求主体部分 (没有数据大小限制,并且相对来说更安全,适用于提交form表单) 用的较少的有put和delete
表单中action表示web服务器端用于接收此表单数据的页面method采用哪一种http请求方法
4、JSP WEB服务器(又叫做WEB容器):用于存储html,jsp,servlet和其他一些web组件
5、Tomcat目录结构
bin:用于存放一些Tomcat提供的命令 conf:Tomcat server的一些默认配置 logs:用于存放一些日志文件的目录 webapps:用于存储web应用(WEB应用部署的目录) work:web引用的临时目录 7、如何部署jspWEB应用 在webapps目录下创建一个文件夹,该文件夹是用于存储jsp页面的,然后再该目录下创建 jsp页面,并创建WEB-INF目录,然后在WEB-INF目录下创建web.xml应用描述文件 <welcome-file-list> <welcome-file></welcome-file> <welcome-file></welcome-file> <welcome-file-list> 然后在conf目录下的server.xml文件中b的<host>标签内添加<context>标签 <context path="项目名" docBase="项目名" debug="0" reloadable="true"> </context> 1)、path表示url访问时所指定的应用名称: 2)、docBase指明整个应用文件的位置(备注:该位置相对与webapps这么目录) 3)、debug表示调试等级 4)、reloadable表示重启tomcat是是否重新加载 8、如何手动打包一个WAR包,并部署 创建一个web项目,进入到该目录下,使用java -cvf 项目名.war 生成一个包含有web.xml和WEB-INF目录的war包 9、jsp的执行过程 1、browser发送request请求 2、jsp页面由JSP parser转换成Servlet.java文件 在_jspService方法由out.write方法输出JSP页面中的内容 3、由web容器和jdk吧Servlet.java文件编译成.class字节码文件 4、执行.class字节码文件生成response响应并传输给browser(浏览器) 第二章 JspServlet 1、Servlet的优点有 1、移植性好 2、功能强大 3、性能好 4、可靠安全 2、Servlet包结构 javax.Servlet.提供了基本的servlet基本库,抽象类和接口 javax.Servlet.http.扩展和继承了javax.Servlet.中的一些类和接口 如何插件一个我们自己的servlet: 从 public abstract interface Servelt{ //得到ServletConfig的初始化信息和启动参数 ServlettConfig getServletConfig(); //被servlet容器调用,并根据初始化信息来创建一个servlet实例 void init(ServletConfig servletConfig)throwsException; //接收用户请求并返回用户信息 void service(ServletRequest servletRequest ,ServletResponse servletResponse) //返回Servlet相关信息,包括作者,版本,版权等 String getServletInfo() //被Servlet容器调用,当该servlet不用的时候释放掉所占有的所有资源 void destroy() } 总结: 1、Servlet接口只定义了servlet和客户端联系的方法并没有具体的实现 2、Servlet开始接收客户请求前由servlet容器调用init()方法对其初始化并将该实例放到了服务器中 3、Service()方法被servlet容器调用接受客户的请求处理 1)、ServletRequest类:包含客户端的请求信息 2)、ServletResponse类:包含例客户端做出的相应 该方法会抛出ServletException和IOException两个异常 4、当Servlet实例长期不用,将被servlet容器通过垃圾处理器回收,并释放其所占的资源 3、javax.servlet.Servlet接口的派生类 //该类实现了Servlet接口并实现了部分方法,当创建普通的和HTTP无关的操作是可以通过是可以通过继承该类来创建新的servlet javax.servlet.GenericServlet 该类继承了GenericServlet,并新增了HTTP有关的几种操作 javax.servlet.http.HttpServlet //用来处理Http get请求 doGet(HttpServletRequest request, HttpServletResponse response); //用来处理Http post请求 doPost(HttpServletRequest request, HttpServletResponse response); // 用来处理Http请求的,可以处理get, post,delete service(HttpServletRequest request, HttpServletResponse response); 4、如何创建及配置Servlet 1、新建Java类,继承javax.Servlet.http.HttpServlet 2、实现service(HttpServletRequest servletRequest ,HttpServletResponse servletResponse)throwservletException,IOException; 3、进入WEB-INF目录,更新web.xml文件,增加Servlet描述信息,告诉web容器已经创建了一些Servlet 4、servlet说明: <servlet> <servlet-name></servlet-name> <servlet-class></servlet-class> <servlet> 5、servlet url匹配: <servlet-mapping> <servlet-name><servlet-name> <url-pattern></url-pattern> </servlet-mapping> 5、Servlet生命周期 1)、在web容器启动时,调用initial(ServletConfig)方法初始化Servlet 2) 、由响应的Http请求方法或者service()方法处理请求并返回响应 3)、当servlet使用时,web容器调用destroy()方法销毁servlet 6、jsp的工作原理是什么? 答:在一个jsp文件第一次被请求时,jsp引擎把该jsp文件转换成servlet,而servlet则是一个java原文件,如果转换时发现jsp文件有语法错误转换过程将中断 并向服务端或者客户端发出错误信息否则则转换成功,jsp引擎用javac把该java文件编译成相应的class文件,然后通过构造方法创建一个servlet实例该实例的jspinit方法被执行 jspinit在整个servlet的生命周期只被执行一次。然后jspService方法被调用来执行客户端浏览器的请求。对于每一个请求jsp引擎都会创建一个新的线程来处理该请求由于servlet 始终驻留在内存中所以需要是非常快的。如果.jsp文件被修改,服务器根据设置决定是否将该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用, 然后servlet实例便被标记加入"垃圾收集"处理。 jspInit()及jspDestory()格式如下:可在jspInit()中进行一些初始化工作,如建立与数据库的连接,或建立网络连接,从配置文件中取一些参数等,在jspDestory()中释放相应的资源7、三层WEB结构是哪三层?并解释每一层的作用?
答:分别是:数据层,表示层,业务层 数据层:用于与数据打交道 表示层:用户显示的表示层 业务层,表示层与业务层的桥梁 三层的好处在于表示明确,扩展性好,逻辑性好,当要加开发成本 8、在IE地址栏中输入http://localhost:8080/ServletExample/HelloServlet去访问servlet,那么请问该请求会去调用servlet的那个方法?为什么? 答:首先又客户端ie浏览器发送请求,那么服务器会调用相对的servlet程序去处理请求而servlet先会创建一个实例又实例去然后调用实例的init初始化方法,通过调用service方法去创建线程处理一个个客户端的请求 9、请描述一下HttpServletReuqest和HttpServletResponse的作用 HttpServletRequest是专门用于Http协议的ServletRequest的子接口他用于封装HTTP请求同HttpServletResponse一样在servic()方法内部调用HttpServletRequest对象的各种方法请求,来获取请求信息,web客户端发送给web服务器的消息分为请求行,请求消息头,消息正文。 获取请求行的相关信息有如下一些getMethod方法返回HTTP请求消息中的请求方式。 getRequestURI方法返回请求行中的资源名部分。 getQueryString 方法返回请求行中的参数部分。 getProtocol方法返回请求行中的协议名和版本。 getContextPath方法返回请求资源所属于的WEB应用程序的路径。 getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。 getPathTranslated方法返回URL中的额外路径信息所对应的资源的真实路径。 getServletPath方法返回Servlet的名称或Servlet所映射的路径。 获取网络连接信息的主要方法有如下一些: getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.it315.org”这种格式。 getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。 getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。 getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。 getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。 getServerName方法返回当前请求所指向的主机名。 getServerPort方法返回当前请求所连接的服务器端口号。 getScheme方法返回请求的协议名,例如http、https或ftp。 getRequestURL方法返回客户端发出请求时的完整URL。 至于获取请求头方法基本上就是get加上相应请求头的名字。 第三章 JSP动作指令 1、指令标签 <%@page %> page指令标签:申明当前jsp页面的编码格式,文本类型,编写语言和需要导入的类文件 import属性为导入相关类文件的权限定名,每个类文件用","号隔开 errorPage属性指明当页面出现java异常时跳转到某个页面,errorPage="errorPage.jsp"; session="true/false"表示当前jsp页面是否可以使用Session会话对象 <%@ include file=""%> 表示动态的引用一个文件,如果是纯html,则copy到主页面中 如果其中还包含有java代码,加载到主页中后java代码会被编译 被包含的页面中不需要出现主页面中已经有的不重复出现的html标签,只需要写放在body标签内的内容2、Java程序判断
<%%>不能在程序片段内定义方法,包含在此标签内部的代码最终会被放在由JSP引擎转换成的Servlet java文件的_JspServlet方法内部 所以此处不能定义方法,定义的变量为局部变量 <%!%>变量和方法定义的标签,变量在多个线程间共享,变量和方法只在当前页面有效,最好使用<%%>变量作为Servlet的成员变量,方法为成员方法 3、如何对变量进行输出 1)、使用out.write()或者out.print()方法 2)、使用<%=变量名或方法%>也可以直接对集合类型进行输出,不需要加分号 4、JSP动作指令 <jsp:include>表示动态的包含另外的一个文件,并且可以使用<jsp:param>给包含的文件传递参数在被包含的文件中使用request.getParamenter()方法获取传递过来的参数 <jsp:include>指令每次都动态的加载页面,所以页面有修改,也能及时被重新编译在 <jsp:forword>指令用于在web容器内部进行Jsp页面的转发,由一个jsp转发到另外一个jsp页面并且可以使用jsp:param指令传递参数给转发到的页面,在转发的页面中通过 request.getParamenter()方法获取传递过来的参数; <jsp:plugin>运用运行applet小应用程序,也可以使用jsp:param传递参数 <jsp:useBean>可以引用Bean对象 1)、<jsp:uesBean id="" class=""/>id表示Bean对象的名称,在setProperty和getProperty中id用来表示Bean对象 2)、<jsp:setProperty name="" property="" value=""/>name表示哪个Bean对象,引用uesBean里的id,Property表示bean对象中某个属性的名称,value即为该对对象 指定Property的值 3)、<jsp:getProperty name="" property=""/>并且setProperty和getProperty可以不在uesBean使用uesBean所产生的对象放在PageContext页面上下文中5、请求状态响应
1)、正常响应status code(状态码):200 2)、重定向一个页面:302 3)、内部服务器错误(java代码异常):500 如何处理此错误? 使用page指令的errorPage属性 4)、请求的资源不存在:404 6、include指令与include动作比较include指令 jsp:include动作
语法格式 <%@include file=".."%> <jsp:include page="">
发生作用时间 页面转换期间 请求期间 包含的内容 文件的实际内容 页面的输出 转换成的servlet 一个servlet 两个servlet 编译时间 较慢 较快 执行时间 稍快 较慢第四章 九大内置对象
session.setMaxInactiveInterval(10); // 用来设置session会话保持的最长时间,以秒为单位 response.setIntHeader("Refresh", 5); // 每隔5秒刷新本页面 response.setHeader("Refresh", "10;URL="); // 10秒后转到指定页面 out.print("body in bytes: " + request.getContentLength() + "<br />"); // 获取请求体部分的内容的长度,以byte为单位 out.print("content type: " + request.getContentType() + "<br />"); // 获取请求的内容类型 out.print("context path: " + request.getContextPath() + "<br />"); // 获取应用的路径信息 out.print("server ip: " + request.getLocalAddr() + "<br />"); // 服务器端IP out.print("client" + request.getRemoteAddr() + "<br />"); // 获取浏览器端IP地址 out.print("http method: " + request.getMethod() + "<br />"); // 获取请求方法 out.print("query string: " + request.getQueryString() + "<br />"); // 获取查询字符串 out.print("request uri: " + request.getRequestURI() + "<br />"); // 获取URI(统一资源标识符) out.print("request url: " + request.getRequestURL() + "<br />"); // 获取URL(统一资源定位符) out.print("session id: " + request.getRequestedSessionId() + "<br />"); // 返回 客户端对应的session id HttpSession sess = request.getSession(); // 由request获取HttpSession会话对象 out.print("session id:" + sess.getId()); out.getBufferSize()//缓冲区大小 out.getRemaining()//缓冲区剩余大小 out.isAutoFlush() //是否自动清空缓冲区 1、out隐含对象(输出对象) 直接用于在JSP页面输出内容 Javax.servlet.jsp.JspWriter(抽象类)继承制java.io.Writer Jsp中的out对象最终被转换成servlet中的jspWriter对象 2、request隐含对象(请求对象) 用于获取Http请求相关信息,比如查询字符串,表单数据 javax.servlet.http.HttpServletRequest 3、page对象(页面对象) 表示对应单个JSP页面,servlet中声明如下: final java.lang.Object page=this//page表示当前对象 4、PageContext(页面上下文) finaljavax.servlet.jsp.pageContext pageContext; 页面上下文可以使用setAttribute(String,String)设置当前页面所存储的信息,页面间不共享数据使用getAttribute(String)方法获取在页面上下文中设置的属性 5、session对象(会话对象) 会话对象可以保存用户的基本信息,如一个用户登录到一个网站,该网站可以记录此用户的信息,并且用户信息在网站的所有页面间共享会话信息存储在服务器端(数据库, 文件系统,web容器本身实现的session存储)在A页面中使用session对象的setAttribute(String,String)方法存储数据,在其他页面中直接使用session.getAttribute (String)方法获取数据 javax.servlet.http.HttpSession session=null; 对Tomcatweb容器来说,一个会话的持有时间为30分钟(会话超时时间,单位为分钟) 在conf目录的web.xml <session-config> <session-timeout>30</session-timeout> </session-config> 6、application对象(应用程序对象) 整个应用都能使用,不限于某个用户,所有用户都能访问的数据应该放在application对象中同样有setAttribute(String String)和getAttribute(String)方法 final javax.servlet.ServletContext application 7、response对象(响应对象) response、sendRedirect("url")重定向到某个页面 8、config对象(Servlet配置信息) final javax.servlet.servletConfig config;为jsp页面配置Servlet <servlet> <servlet-name>configServlet</servlet-name> <jsp-file>/config.jsp</jsp-file><!-- 由哪个JSP页面转化成的servlet --> <init-param> <!-- servlet初始化参数 --> <param-name>configName</param-name> <param-value>myValue</param-value> </init-param> <load-on-startup>1</load-on-startup><!-- 在web容器启动时被初始化 --> </servlet> <servlet-mapping> <servlet-name>configServlet</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping> 在config.jsp页面中由config对象的getInitParameter()获取初始化参数 9、exception对象(异常对象) java.lang.Throwable exception = 如果想要使用exception对象,则使用该对象的页面(错误处理页)必须在page指令中声明isErrorPage="true"10、隐含对象的作用范围
1、pageScope 只能作用于页面 page ,out,pageContext 2、reqyestScope 作用于Http请求,到了另外一个页面,request失效 request由页面A转发到页面B,则request同时作用于页面A和页面B 3、SessionScope session作用域,用于所有页面 session 4、applicationScope 应用程序作用域,作用于整个应用程序的所用用户的所用页面 application 11、重定向和转发的区别 转发: web容器内部由一个JAP转发到另外一个JSP页面,客户端地址栏URL不会改变request.getReauestDispatcher("url").forWord(request,response);转发时指定的URL前可以 加 "/"转发中url相当于ContextPath,转发可以用request的setAttribute给目标页面传递参数,目标页面也可以通过request.getAttribute()方法获取传递过来的参数 重定向: 实际是告诉浏览器由一个页面跳转到另外的一个页面,客户端浏览器地址栏会发生改变,显示出目标地址HTTP Response status Code:状态码为302response.sendRedirect ("url")重定向中,URL相对于ContextPath来重定向,所以不需要再URL前加"/"。 12、Cookie 保存网站信息到客户端浏览器, 这个数据可以轻易地被获取到 JSP中,通过Cookie对象保存信息,key-value 通过response.addCookie(Cookie)添加cookie到浏览器端 通过request.getCookies()方法获取由客户端发送过来的Cookie对象数组,如果没有cookie,则返回 null 所以服务端需要进行null判断 1)cookie信息是在浏览器中的,但并不是所有的浏览器都支持cookie功能; 2)cookie对象不能单独使用,必须和request对象或response对象结合使用; 3)不同的浏览器中存储的cookie不是通用的。例如:IE存储的cookie只有IE自己使用; 4)存储在浏览器中的cookie对任何Web服务器都是开放的,所以写入的cookie可能被其它网页读取或覆盖掉第五章 JavaBean
1、什么是JavaBean JavaBean是一个普通的Java类,封装了get,set方法,并且可以增加一些通用的逻辑,增加了代码的重用性 1)、javabean是一个公开的(public)类 2)、javabean类必须有一个无参的构造方法 3)、javabean中变量通常称为属性 4)、取得或设定属性是,必须使用getXXX()和setXXX()方法。(java技术规范)复习:
变量: 成员变量: 类变量:在类里面用static关键字修饰的变量,通过类或对象来 访问,通常使用类来访问,实例方法不能访问静态变量 实例变量:在类里面未用static关键字修饰的变量,只能通过对象来访问 局部变量: 在方法里定义的变量,必须进行初始化,只作用于该方法内部,如果方法内部有局部内部类使用方法里的某个变量,则该变量必须声明为final变量 方法: 成员方法: 静态方法 实例方法 构造方法: 2:jsp:uesBean uesBean指定的id==>session.setAttribute("user",com.gs.bean.User user); 所以可以使用removeAttribute方法移除page,request,session,application对应的java Bean组件 jsp:setProperty jsp:getProperty的自省机制 表单里的name与setProperty和getProperty所指定的bean对象的属性名称一致 在使用setProperty的时候,可以使用*号匹配所有的属性 找到eclipse内置的tomcat的目录第六章 数据源和连接池
1、JNDI java Naming and Directory Interface(JAVA命名和目录服务接口) 通过一个指定的字符串就能找到指定的资源JNDI规范通常提供一个lookup方法通过资源字符串查找所指定的资源 2、DataSource 通过一定的配置信息告诉WEB容器,应用连接到哪一个数据源 3、配置数据源和数据连接池 1)、在tomcat的conf目录下的context.xml文件中添加资源描述标记 <Resource name="jndi/datasource" 数据连接池资源的名称 auth="Container"认证类型,由容器提供认证 type="javax.sql.DataSource"表示此资源的类型是什么,javax.sql.Datasource表示为jdbc的数据源类型 driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=db_name" username="user_name" password="user_password" maxTotal="20"最大连接数 maxIdle="5"最大空闲连接数 maxWaitMillis="10000"最大等待时间 /> 备注:对于tomcat的来说版本有差异,可以参考<ResourceParams>标记信息 对于6.0及以上的tomcat,只需要使用<Resource>标记,把相关的参数配置直接放在该标记的属性部分 对于5.0 6.0 7.0 来说最大连接数是maxActive,最大等待时间是maxWillis 2)、在应用的web.xml文件中声明引用了哪个资源 <resource-ref> <description>JNDI JDBC DataSource</description> <res-ref-name>jndi/datasource<res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <resource-ref> 3)、使用Context去获取配置的jndi资源 javax.naming.Context context = new javax.naming.InitialContext(); Object obj =context.lookup("javax:comp/env/jndi/datasource"); javax.sql.DataSource ds=(javax.sql.DataSource)obj; javax.sql.Connection conn=ds.getConnection(); 4、数据库连接池对数据库相关对象的关闭操作 rs.close(); conn.close(); 以上的关闭操作,是交由Tomcat容器来做的,conn.close并没有真正的把建立好的数据库连接关闭,而是把此数据库连接放回到数第七章 过滤器和监听器
1、什么是过滤器? 过滤器是在某个URL之前所需要做的事情,URL可能是某个servlet所对应的,也有可能是jsp页面 特点: 声明式的 动态的 灵活的 模块化的 可移植的 可重用的 透明的 用处: 统一认证处理 对用户的请求做检查,做更精确的记录 监听或对用户所传递的参数做前置处理,如防止数据隐藏码攻击 改变图像文件的格式 对响应做编码的动作 对响应做压缩处理 对呀XML的输出使用xslt来转换 2、过滤器的写法 1)、自定义类,实现javax.servlet.Filter接口 2)、分别实现init(FilterConfig)doFilter(ServletRequest ,ServletResponse,FilterChain) destroy() 3)、在web.xml中配置该filter 告诉web容器存在这么一个filter,可以使用<init-param>配置filter的初始化参数,在Filter代码中 用FilterConfigd对象来获取初始化参数 <filter> <filter-name></filter-name> <filter-class></filter-class> </filter> 告诉web容器此filter对那个URL进行过滤 <fliter-mapping> <filter-name></filter-name> <serlvet-name></servlet-name> <url-pattern></url-pattern> <filter-mapping> 3、Filter的-生命周期 *1)、init(FilterConfig)在tomcat容器启动时就会对过滤器进行初始化 2)、在执行其过滤的url时,先初始化该URL所对应的servlet据库连接池
备注:如果想让eclipse直接使用数据连接池的方式运行应用,则把context.xml文件copy到WebContent目录下的META-INF目录