JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇
第一章 动态网页开发技术概述
1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页。
2.JSP的运行原理:当用户第一次请求某个JSP文件时,容器首先检查JSP文件的语法是否正确,然后将JSP文件转换成Servlet原文件,并调用Java工具类将Servlet原文件编译成字节码文件。接下来,容器加载转换后的Servlet类,实例化一个该类的对象处理客户端的请求,请求处理完成后,容器将HTML格式的相应信息发送给客户端,执行过程如图所示:
3.JSP的特点:A.将内容的生成和现实分离 B.使用可重用的组件 C.采用标签简化页面开发 D.完善的存储管理和安全性 F.一次编写,处处运行
4.JSP2.0 新功能 A.引入表达式语言 B.简单标签 C.使用JSP fragment
第二章 静态网页开发技术
1.JavaScript简介:JavaScript是一种动态的、弱类型的、基于对象和事件驱动的脚本语言,它的解释器被称为JavaScript引擎,是浏览器的一部分。
2.JavaScript中的事件:是指某个对象发出的消息,标志着某个特定行为的发生或某个特定的条件成立。常见的事件:A.点击事件onClick B.改变事件onChange C.选中事件onSelect D.聚焦事件 对事件处理的代码叫做:事件处理程序,它通常有函数实现。
3.常见的对象:String对象、document对象、window对象。
4.CSS概述:Cascading Style Sheets即层叠样式表,简称样式表,CSS是一种为网站添加布局效果的出色工具。为我们的网站披上一件华丽的外衣。
5.CSS的优点:A.通过单个样式表控制多个文档的布局 B.更精确的布局控制 C.为不同的媒体类型采取不同的布局。
第三章 JSP基本语法
1.页面构成:脚本元素:声明、脚本段、表达式;注释:HTML注释、Java注释、JSP隐藏注释;指令元素:page、include、taglib等;动作元素:jsp:include、jsp:forward、jsp:useBean等。
2.page指令:页面指令,用来定义整个JSP页面的属性和相关功能。Language属性(指定脚本元素中使用的脚本语言,默认为Java)、contentType属性(指定JSP页面输出内容的类型和字符编码方式)、pageEncoding属性(指定JSP页面的字符编码)、info属性(页面的描述信息)、import属性(导入脚本元素中用到的Java类)、session属性(指定当前页面中内置对象是否可用)、errorPage属性(指定当前页面在运行过程中发生异常时,转向哪里进行异常处理)、isErrorPage属性(指定当前页面是否是异常处理页面)、buffer属性(设置JSP内置对象out的缓冲区大小或不使用缓冲区)、autoFlush属性(指定当out对象的缓冲区填满时,缓冲区是否自动刷新)、isELgnored属性(指定JSP页面中是执行还是忽略EL表达式,属性的值为布尔类型)
3.include指令:作用是在JSP页面中静态包含一个文件,被包含的文件必须和当前JSP也处于同一个Web应用中。<%@ include file=”” %>先包含后编译。而<jsp:include page=”” />是动态包含其他资源即先编译后包含。
第四章 JSP内置对象
1.九大内置对象:
对象名 |
类型 |
对象说明 |
out |
javax.servlet.jsp.JspWriter |
HTML标准输出 |
request |
javax.servlet.http.HttpServletRequest |
封装请求消息 |
response |
javax.servlet.http.HttpServletResponse |
封装响应消息 |
session |
javax.servlet.http.HttpSession |
封装会话消息 |
application |
javax.servlet.ServletContext |
封装应用信息 |
pageContext |
javax.servlet.jsp.PageContext |
封装当前JSP页面的上下文信息 |
exception |
java.lang.Throwable |
封装异常处理信息 |
config |
javax.servlet.ServletConfig |
封装JSP页面的Servlet配置信息 |
page |
java.lang.Object |
如同Java中的this |
out对象
向浏览器输出数据的方法:A.void print() B.void println() C.void newline()输出新的一行
操作缓冲区的方法:void flush() 刷新缓冲区的数据到客户端 void close()刷新缓冲区,并关闭输出流。
request对象
reqeust对象封装了浏览器的请求消息,通过request对象的各种方法可以获取客户端以及用户提交的各项请求信息,请求信息包括请求的头部信息、请求方式、请求的参数名称、参数之等。
获取请求参数信息的方法:String getParameter(String name):获取请求参数name的值,并以字符串形式返回,如果参数name不存在则返回null。
String[] getParameterValues(String name):获取请求参数name的所有参数值,返回的是字符串数组,如果参数name不存在则返回null。
Enumeration<String>getParameterNames():获取请求中所有参数的名称
Map<String,String[]> getParameterMap():以Map类型返回请求的所有参数,其中参数名作为Map的key,Map的value是这个参数名对应的所有参数值的字符串数组。
Object getAttribute(String name):返回指定名称的属性值,如果指定的属性不存在,则返回null。
void setAttribute(String name, Object o):在请求对象中存储名称为name,值为o 的属性。
void removeAttribute(String name):删除指定名称的属性。
response对象
void sendReridect(String url):将页面重新定向到url指定的地址。这个方法必须在响应被提交之前调用,否则会抛出异常。
session对象
session对象是在会话范围内,记录每一个客户端的访问状态,以便于跟踪每一个客户端的操作。
工作原理:当客户端首次访问服务器的JSP页面时,服务器会为该客户端分配一个session对象,同时为该session对象指定一个唯一的ID,这个ID被存储在Cookie对象中随着响应对象返回给客户端,使得客户端与服务器的session对象建立一一对应关系。当客户端继续请求服务器上的其他资源时,存储着session ID的Cookie对象会随着请求对象一起发送到服务器,此时服务器通过session ID找到客户端所对应的session对象。客户端的session ID 一直有效,直到客户端浏览器关闭、超时或调用session的invalidate()方法使其失效。 session ID 失效表示客户端与服务器的会话结束,客户端再次连接服务器时,会为其重新分配session对象。
常用方法:
void setAttribute(String name, Object value)、Object getAttribute(String name)、void removeAttribute(String name)、getId():获取session对象ID 、boolean isNew():判断是否为新的会话、setMaxInactiveInterval(int interval):设置session对象的最大持续时间,单位是秒。void invalidate():使session对象失效.
Cookie简介
Cookie通常用于浏览器端保存会话过程中的一些信息,如登陆信息、会话ID等。他不属于JSP内置对象。
功能:Cookie可以实现让站点跟踪特定访问者的访问次数,最后访问时间以及访问者最后进入站点的路径;Cookie能够帮助站点统计用户个人资料以实现各种各样的个性化服务;Cookie在同一站点实现自动登陆功能,使得用户不用输入用户名和密码就可以进入曾经浏览的站点。
Cookie和session对象的区别:
A.存放地点:Cookie对象存放在客户端的硬盘里,属于离线存放;session对象存放在服务器的内存中;B.存活时间:Cookie对象可以长时间存放在客户端,具体时间由setMaxAge()方法所指定的数值决定;sessino对象随着用户访问服务器而产生,虽客户端的超时或下线而消失。 C.安全性:Cookie对象存放在客户端,可能会被别有用心的网站读取,安全性较差,session对象存放在服务器的内存中,用户不能修改,安全性较好。
application对象
application对象负责为JSP页面提供在服务器运行的一些全局信息,它在服务器启动时创建,直到服务器关闭时消失。
第五章JDBC访问数据库
JDBC访问数据库的步骤:导入java.sql包--->加载数据库驱动--->定义数据库的连接地址,用户名和密码---->得到与数据库的连接对象--->声明SQL语句--->得到语句对象--->执行SQL语句---->处理SQL语句的返回结果--->关闭对象。
JDBC连接mysql代码:
package com.jinzhi.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBManager { private Connection conn; private PreparedStatement ps; protected ResultSet rs; /** * 拿到数据库连接 * @return */ protected Connection getConn() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/book?characterEncoding=utf-8", "root", ""); System.out.println("连接成功!"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } /** * 查询数据库 * @param sql * @param obj * @return */ public ResultSet query(String sql, Object[] obj) { this.conn = this.getConn(); try { ps = this.conn.prepareStatement(sql); if(obj != null && obj.length > 0) { for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } } rs = ps.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } /** * 数据更新方法 * @param sql * @param obj * @return */ public int update(String sql, Object[] obj) { this.conn = this.getConn(); int count = 0; try { ps = this.conn.prepareStatement(sql); if(obj != null && obj.length > 0) { for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } } count = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return count; } /** * 关闭数据库 */ public void closeAll() { try { if(rs != null) { rs.close(); rs = null; } if(ps != null) { ps.close(); ps = null; } if(conn != null) { conn.close(); conn = null; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { DBManager manager = new DBManager(); System.out.println(manager.getConn()); } }
使用JavaBean组件
软件可重用技术的核心在于可重用组件,JavaBean提供了通用功能,可以在Java应用中重复使用。
使用JavaBean的好处:可以使得JSP页面变得清晰;节省软件开发时间;降低系统维护的难度;为JSP也能够用带来了更多的伸缩性,使系统变得健壮和灵活。
第六章Servlet技术
Servlet是Java语言编写的程序,运行于支持Java的Web服务器或应用服务器中。它优于JSP出现,提供和客户端动态交互的功能。
优点:可移植性、安全、高效。
Servlet生命周期
1)当客户端第一次请求Servlet时,Servlet被加载到内存,容器会创建这个Servlet的实例,并调用init方法进行初始化工作。
2)容器创建请求对象和响应对象,然后调用Servlet的service方法为客户端提供服务。
3)当Servlet不在被需要时,容器调用Servlet的destroy()方法将Servlet实例销毁。
4)Servlet的整个生命周期中,init方法和destroy方法只会被调用一次。
如下图:
Servlet过滤器,
Servlet过滤器是一种Java组件,它位于客户端和处理程序之间,能够对请求和响应进行检查修改。它通常用来完成一些通用的操作,如统一字符编码、字符编码、加密、实施安全控制等。摘网上图,如下图:
Servlet监听器
与Java中的监听器类似,Servlet监听器也用来监听重要事件的发生,只不过它监听的对象是Web组件。
有关Servlet监听器接口及事件类参考网址:http://blog.csdn.net/b_qxzb/article/details/47402095博客
Jsp和servlet的相同点和不同点:
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
什么事MVC模式,使用MVC模式开发系统有哪些优缺点?
1)MVC原理
mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。
1、模型(model)它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的Action,dao类)和数据模块(pojo类)。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性
2、视图(view) 用户与之交互的界面、在web中视图一般由jsp,html组成
3、控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用
2)MVC的优点
1、可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
2、视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
3、模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
4、潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
3)MVC的不足之处
1、增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2、视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
3、视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
4、目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。
第七章EL表达式
EL隐含对象
隐含对象 |
描述 |
pageContext |
页面上下文对象,用于访问JSP的内置对象,如:application、response、out等 |
param |
Map对象,存储参数名和单个值的映射 |
paramValues |
Map对象,存储参数名和一个数组的映射 |
header |
Map对象,存储请求头中的信息名和单个值的映射 |
headerValues |
Map对象,存储请求头中的信息名和一个数组的映射 |
cookie |
Map对象,存储请求中cookie名和单个值的映射 |
initParam |
Map对象,存储Web应用在上下文初始参数和单个值得映射 |
pageScope |
Map对象,存储页内有效范围内的命和值得映射 |
reqeustScope |
Map对象,存储请求有效范围内的命和值得映射 |
sessionScope |
Map对象,存储会话有效范围内的命和值得映射 |
applicationScope |
Map对象,存储应用范围内的命和值得映射 |
JSTL标签
核心标签库 |
完成JSP页面的常用功能 |
格式标签库 |
国际化标记 |
SQL标签库 |
访问基本的关系型数据库的能力 |
XML标签 |
处理和生成XML的标记 |
函数标签库 |
字符串操作函数 |
JSTL 标签大全详解参考博客:http://blog.csdn.net/qq_25827845/article/details/53311722
补充一个知识点:
关于jQuery.ajax()使用实例:
使用jQuery.ajax()方法获取数据,下边给个常用写法,并做了相应的注释。
代码如下
$.ajax({ url: "http://www.hzhuti.com", //请求的url地址 dataType: "json", //返回格式为json async: true, //请求是否异步,默认为异步,这也是ajax重要特性 data: { "id": "value" }, //参数值 type: "GET", //请求方式 beforeSend: function() { //请求前的处理 }, success: function(req) { //请求成功时处理 }, complete: function() { //请求完成的处理 }, error: function() { //请求出错处理 } }); 使用jQuery.ajax() 这里将显示数据 $.ajax我的实际应用例子 //1.$.ajax带json数据的异步请求 var aj = $.ajax( { url:'productManager_reverseUpdate',// 跳转到 action data:{ selRollBack : selRollBack, selOperatorsCode : selOperatorsCode, PROVINCECODE : PROVINCECODE, pass2 : pass2 }, type:'post', cache:false, dataType:'json', success:function(data) { if(data.msg =="true" ){ // view("修改成功!"); alert("修改成功!"); window.location.reload(); }else{ view(data.msg); } }, error : function() { // view("异常!"); alert("异常!"); } }); //2.$.ajax序列化表格内容为字符串的异步请求 function noTips(){ var formParam = $("#form1").serialize();//序列化表格内容为字符串 $.ajax({ type:'post', url:'Notice_noTipsNotice', data:formParam, cache:false, dataType:'json', success:function(data){ } }); } //3.$.ajax拼接url的异步请求 var yz=$.ajax({ type:'post', url:'validatePwd2_checkPwd2?password2='+password2, data:{}, cache:false, dataType:'json', success:function(data){ if( data.msg =="false" ) //服务器返回false,就将validatePassword2的值改为pwd2Error,这是异步,需要考虑返回时间 { textPassword2.html("<font color='red'>业务密码不正确!</font>"); $("#validatePassword2").val("pwd2Error"); checkPassword2 = false; return; } }, error:function(){} }); //4.$.ajax拼接data的异步请求 $.ajax({ url:'<%=request.getContextPath()%>/kc/kc_checkMerNameUnique.action', type:'post', data:'merName='+values, async : false, //默认为true 异步 error:function(){ alert('error'); }, success:function(data){ $("#"+divs).html(data); } });