第一章 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=http://www.baidu.com"); // 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目录