1.HTML:超文本标记语言!不是一种编程语言,是一种描述性的标记语言,用于描述超文本中内容的显示方式。比如字体、颜色、大小等。 // 显示数据 JSP也是最终响应回 一个HTML格式页面来显示数据!
2.CSS:层叠样式表!作用:定义网页的显示效果。简单一句话:CSS将网页内容和显示样式进行分离,提高了显示功能。
外联:引入的方式
ID选择器:#ID{ xxxx }
类选择器:.class { xxxx }
后代选择器: .class ul(子) { xxxxx }
并集选择器: h1, h3, p, ul { xxxxx }
子元素选择器: h1 > strong { xxxxx }
属性选择器: h1[id][class] { xxxxx }
伪类顺序:(LoVe HAte原则) a:link > a:visited > a:hover > a:active
字体属性的继承性(子-->父) eg:在中同一设置字体属性
优先级: 行内样式 > ID选择器 > class选择器 > 标签选择器 > *(通配符)选择器 > 继承的样式 > 默认样式
块级标签:独占一行或多行
- ===>互转 display:inline
行级标签:不占独立区域 多个行标签 可以共用一行
===>互转 display:block
3.JavaScript:JavaScript是弱变量类型的语言. 弱变量类型:定义变量的时候变量,没有具体的类型.当变量被赋值的时候.变量才会有具体的数据类型.// JS都会由事件触发.
JS不是面向对象的 是基于对象. JS中的函数就是对象.
JavaScript中5种原始数据类型:
Undefined、Null、Boolean、Number 和 String
全等和非全等(=== !==)
4.Xml:是指可扩展标记语言(eXtensible——Markup——Language),它是一种标记语言,很类似HTML。 // 它被设计的宗旨是 传输数据,而非显示数据。
应用场景(作用):1.保存数据;2.作为配置文件使用
4.a)DOM解析:需要读取整个XML文档
API:
NodeList nodeList = document.getElementsByTagName(String node);
Element element=(Element) nodeList.item(0);//可能涉及到强转
Element element = document.createElement(String element);
element.setTextContent(String content)
element.getTextContent()
element.setAttribute(String name,String value)
element.getAttribute(String name)
熟练dom解析xml的7种操作:
//1、得到某个具体节点的内容
//2、遍历所有节点
//3、修改某个元素节点的主体内容
//4、向指定元素节点中增加子元素节点
//5、向指定元素节点中增加同级节点
//6、删除指定节点
//7、操作XML文件属性
4.b)SAX解析:边读取边解析 // SAX 是事件驱动的 XML 处理方法 ===== 基于事件驱动
dom4j工具类解析xml // DOM4J解析XML是一级一级的解析 根 > 子 > 孙 > ...
用SAXReader对象的read()方法读取xml文件,得到的是dom4j的document对象(不是w3c) ======> new SAXReader().read("/.../abc.xml"); // Tips: 此处是文件
document <==> String 互转: document.asXML() ==> String / String.parseText(xmlString) ==> document
dom4j保存Document对象: // XMLWriter对象的write()方法(写入到本地磁盘中)
OutputFormat format=OutputFormat.createPrettyPrint() // 格式化后的xml // OutputFormat format = OutputFormat.createCompactFormat(); // 无格式化的
format.setEncoding("utf-8");
new XMLWriter( new FileOutputStream("src/first.xml"), format )
writer.write(document); // 此document为 上文中用SAXReader对象解析本xml得到的 ---中途做了CRUD操作,完了再写回源文件
常用API:
Element getRootElement()Document的方法,用来获取根元素;
List elements()Element的方法,用来获取所有子元素;
String attributeValue(String name)Element的方法,用来获取指定名字的属性值;
Element element(String name)Element的方法,用来获取第一个指定名字的子元素;
Element elementText(String name)Element的方法,用来获取第一个指定名字的子元素的文本内容
int indexOf(Node node)Branch的方法,查找指定节点,在当前Branch的子节点集合中的下标位置。
XPath:是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 // 导入jaxen 的jar包
selectNodes("xpath表达式")用来查找多个匹配xpath表达式的元素
selectSingleNode("/book/author") 用来查找一个匹配xpath表达式的元素
Schema约束: XML文档的约束,.xsd文件,用来替代DTD.
5.HTTP:即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。(Hypertext Transport Protocol)
HTTP协议:(客户端)浏览器与服务器之间的通讯协议!协议不过就是一种格式!
http协议是建立在TCP协议基础上。http协议也是基于请求与响应的模型,http协议默认的端口是80.
/** 笔试题:GET与POST请求区别?
1. get只能传递1kb以下数据,POST可以传递大数据。
2. get请求如果有请求参数,那么,浏览器上会显示请求参数
post请求不会,所以post请求会更安全。
3. 如果是get请求,有请求参数,请求参数是在http请求行的资源路径上。
如果是post请求,有请求参数,请求参数是在请求正文中。——————————>并且有请求参数,才会有请求正文。
*/
1.请求协议:(发送给服务器看的,告知服务器:我的信息,我可以支持哪些技术,让服务器根据这些信息判断,并返回我支持展示的页面内容)
// 浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!
// Tips:在HTTP协议中,请求有很多种请求方法,其中最为常用的就是GET和POST
请求行;
请求头信息;//Referer请求头是比较有用的一个请求头,它可以用来做统计工作,也可以用来做防盗链。
//Referer : 请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:http://www.baidu.com;如果你是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了; ====> 就是说:从那个页面跳转到的本站
空行;
请求体 // 只能放POST请求参数 ——————> POST请求 + 且有请求参数POST请求是可以有请求体的,而GET请求不能有请求体
------> GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
//Content-Type请求头: application/x-www-form-urlencoded表单的数据类型,说明会使用url格式编码数据;
// url编码的数据都是以“%”为前缀,后面跟随两位的16进制,例如“中国”这两个字使用UTF-8的url编码用为“%E4%B8%AD%E5%9B%BD”;
// URL编码 : URLEncoder.encode(String s, String enc) //使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。
// URL解码 : URLDecoder.decode(String s, String enc) //使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码。
%EF%BC%9F ===== utf-8发现:直接地址栏输入中文,可能会在前面 添加此编码输入中国,发现前面多了3个url编码,经decode发现 值为utf-8
%EF%BC%9F%E4%B8%AD%E5%9B%BD
2.响应协议:(发送给浏览器看的)
响应首行;
响应头信息;
// 响应头:
Last-Modified:最后的修改时间;
// 请求头:
If-Modified-Since:把上次请求的index.html的最后修改时间还给服务器;
// 状态码:
304,比较If-Modified-Since的时间与文件真实的最后修改时间一样时,服务器会响应304,而且不会有响正文,表示浏览器缓存的就是最新版本!
//告诉浏览器不要缓存的响应头:
Expires: -1;
Cache-Control: no-cache;
Pragma: no-cache;
// response.setContentType("text/html;charset=utf-8"), 这个方法即规定了编码用utf-8, 同时还设置了content-type响应头,告诉浏览器用utf-8来解码.
// response.setHeader(“content-type”, “text/html;charset=utf-8”)
// response.setHeader("Refresh","5; URL=http://www.baidu.com")
空行;
响应体 // response对象的响应流 ————————> 对于http响应正文,它是真正被浏览器解析并显示在浏览器上的。 JSP————>HTML
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)
6.1.Servlet:是一个资源,是一个java类,是运行在服务器上的。 sun的定义:它就是一个javax.servlet.Servlet接口。
作用:处理请求
接收请求数据;处理请求;完成响应
HttpServlet对Servlet接口的service()进行了重写 ==> 细分为doPost() 和 doGet() 两种请求
生命周期:1.创建servlet对象,常驻内存(我们一般会在web.xml中配置预加载,tomcat启动时就加载一个servlet对象到内存中 load-on-startup配置 1...> 10)
2.执行init(ServletConfig)方法,初始化配置文件等 //参数注入吧。。。 传递服务器创建的 ServletConfig对象 封装有context(全局)/init(局部)-param 初始化参数信息
//配置在web.xml中的
3.执行servce()方法处理请求,每次都新开启一个线程(多线程,不安全)
4.tomcat正常关闭时,执行destroy()方法,销毁servlet对象
//通过查看HttpServlet类的service()方法,可以看到 请求方式除了GET 和 POST ,至少还有5种:DELETE、HEAD、OPTIONS、PUT、TRACE
在web.xml中配置servlet访问路径: 同一个servlet可以 有多个 映射存在(多个访问路径)
缺省: 没有对应的servlet配置的页面,全部由缺省的servlet来处理其请求。(如:html页面)
访问服务端资源(servlet)的方式:
1.浏览器
2.form表单
3.访问资源
4.js代码 location.href="#"
站外资源:http://www.baidu.com
站内资源:工程名+url-pattern值 (站内站外都使用绝对路径,不要用相对路径就是了)
静态:html
动态:jsp/servlet asp php 使用java来完成动态的web资源的开发
6.2.ServletConfig:ServletConfig它是Servlet的一个配置对象,是javax.servlet.包下的一个接口。
1.ServletConfig是由谁创建的?他是怎样传递到Servlet中的?
//ServletConfig对象是由服务器创建的,它是通过Servlet的init方法传递到Servlet中。
2.ServletConfig对象,它的作用是什么
a) 获取Servlet名称 getServletName()
b) 获取Servlet初始化参数 getInitParamete() getInitParameterNames()
c) 获取ServletContext对象。 getServletContext()
3.我们如何获取一个ServletConfig对象?
// getServletConfig() ======> this.getServletConfig();
// 通过查看 父类GenericServlet的源码,我们知道 GenericServlet 实现了ServletConfig接口,Servlet接口 -----重写init(ServletConfig)传入还保存了ServletConfig对象 ,
// 还另外给我们提供了一个无参init() , 有参init( ...调用了无参init())
// 它已经将服务器传递的ServletConfig保存了,并且对外提供了一个公共方法用于获取ServletConfig
6.3.ServletContext:web级域对象,是Servlet存在的环境,实现同一个web应用内的资源共享。//资源:Servlet //它也是javax.servlet包下的一个接口。
1.一个web应用对应一个ServletContext,在web服务器启动时由服务器创建,通过它可以实现servlet之间的资源共享 =====> 域对象 // 同一个web应用中
// 在服务器关闭时销毁
2.要想获取一个ServletContext可以通过ServletConfig来获取,方法是 getServletContext();
======> this.getServletConfig().getServletContext(); ==可以简化为==> this.getServletContext(); //原因自然是:GenericServlet底层做了封装
getRealPath()
// 主要使用getRealPath()方法:它的作用是获取工程中资源文件的绝对磁盘路径。
// getRealPath("/")这代表的是一个绝对路径,它指向的是当前工程在tomcat下的绝对磁盘路径
7.request:开发中通过request对象来获取http请求信息及客户机信息 是Servlet.service方法的一个参数
在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中!!!我们利用request来操作http请求信息
// TomCat 默认通过HTTP协议的编码方式————ISO-8859-1对请求头、行、(体)进行编码,然后将编码后的请求信息 全部封装到———request对象中!!!
request的功能可以分为以下几种:
封装了请求头数据;
request.getHeader(String name)
request.getContextPath() // 返回上下文路径,即工程路径,例如:/OneServlet
request.getServletPath()// 返回Servlet访问路径,url-pattern例如:/oneServlet
request获取请求参数的API:
String getParameter(String name):通过指定名称获取参数值;
String[] getParameterValues(String name):当多个参数名称相同时,可以使用该方法来获取;
Map getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String。
Enumeration getParameterNames():获取所有参数的名字;
Getparameter: 浏览器端数据 -------- 参数// 从request对象中提取封装在它自身的参数信息
GetAttribute: 服务器端数据 -------- 属性 // request域共享数据
封装了请求正文数据,如果是GET请求,那么就没有正文;
request是一个域对象,可以把它当成Map来添加获取数据;
// request可以在一个请求中共享数据。 eg: 请求转发和请求包含
// 一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据
request提供了请求转发和请求包含功能。 //表示:由多个Servlet共同来处理一个请求
request.getRequestDispatcher("/BServlet").forward(request, response); // 在AServlet中,把请求转发到BServlet: tips:留(请求)头不留(请求)体
// 请求转发大多是应用在Servlet中,转发目标大多是JSP页面; 利用request域共享(传递)数据
request.getRequestDispatcher("/BServlet").include(request, response); // 在AServlet中,把请求包含到BServlet: tips:AB共同完成响应头和响应体
// 请求包含大多是应用在JSP页面中,完成多页面的合并;
7.2问题:请求参数乱码问题,它如何产生的,怎样解决? // 服务端————的乱码问题
乱码产生的最根本的原因是在编码与解码时使用的是不同的编码表。
分析一下关于请求参数乱码问题:
简单说,就是浏览器使用了utf-8对汉字进行了编码,服务器使用了iso8859-1对象信息进行了解码。就出现了乱码。
解决乱码方案:
将得到的信息再以iso8859-1进行编码,使用utf-8进行解码就可以。
Get请求解决乱码问题: // reqeust.setCharacterEncoding(encoding) 仅对POST有效! 对GET是无效的!!! 编码内部处理是很复杂的,并不像表面上看的这么简单,
1. 修改conf/server.xml编码//这仅仅是我们去掉了中间复杂传输转换过程,有待深入研究!!!
// 经测试,发现:仅修改此配置,对GET有效,但对POST却无效!! POST还需加 ————>
// reqeust.setCharacterEncoding("utf-8")
2. New String() 进行编码(最多)
new String( name.getBytes("iso-8859-1"), "utf-8" );对get/post请求方式均有效. //前提:没有修改TomCat中conf/server.xml编码 ————否则,GET乱码
// 配置文件 和 new String() ————GET只能二选一 |对POST是无所谓的!
3. 通过js来对请求参数进行编码(了解) ——————> jsp页面的标签
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
// contentType: 1.告诉浏览器提交请求的编码方式
2.解析页面的编码方式
// pageEncoding:1.
//
如果我们的请求方式是post,我们也可以直接通过reqeust.setCharacterEncoding("utf-8")来处理请求参数乱码。
reqeust.setCharacterEncoding("utf-8")// 设置请求对象解码的编码为utf-8
//——————> 可能内部根据我们 传参encoding ,做了new String("编码",解码)
/** ***** GET和POST方式如何解决乱码:
* POST:
* 解决办法:
* request.setCharacterEncoding(“UTF-8”);
* GET:
* 解决办法:
* String name = new String(request.getParameter(“name”).getBytes(“ISO-8859-1”),”UTF-8”);
*/
8.response:response对象是用来对客户端进行响应的 是Servlet.service方法的一个参数,
在客户端发出每个请求时,服务器都会创建一个response对象,用来操作http响应信息。
response对象的功能分为以下四种:
设置响应头信息;
response.setHeader(“content-type”, “text/html;charset=utf-8”)
response.setHeader("Refresh","5; URL=http://www.it.cn")
发送状态码;
response.setStatus(200)
设置响应正文;(重点) // 两个响应流对象 不能同时使用这两个流!!!
// PrintWriter out = response.getWriter():获取字符流; eg: 响应文本 有缓冲区 默认8kb response.flushBuffer()
// ServletOutputStream out = response.getOutputStream(): 获取字节流;eg:下载
// 解决输出乱码问题: response.setContentType("text/html;charset=utf-8"),
// 这个方法即规定了编码用utf-8,同时还设置了content-type响应头,告诉浏览器用utf-8来解码.
new String( name.getByte("iso-8859-1"), "utf-8" );对get/post请求方式均有效.
重定向;(重点)
// response.sendRedirect("/day10/TwoRedirect") 方法会设置响应头为302,以及设置Location响应头
/** 请求转发与重定向比较(重点掌握)
请求转发是一个请求,而重定向是两个请求;
请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
重定向的第二个请求一定是GET;*/
9.jsp:JSP是JavaWeb服务器端的动态资源。它与html页面的作用是相同的,显示数据和获取数据。 (Java Server Pages) // JSP 最终是响应回 HTML页面 来显示数据的!!!
jsp是一种特殊的Servlet,当JSP页面首次被访问时,容器(Tomcat)会先把JSP编译成Servlet,然后再去执行Servlet。所以JSP其实就是一个Servlet!// Sun公司推出的jsp技术
1.Jsp原理:
1. 当浏览器向服务器发送请求访问demo1.jsp页面
2. tomcat的web.xml文件中配置了一个JspServlet,它会对所有后缀名是*.jsp的路径进行处理
3. 会将demo1.jsp翻译成demo1_jsp.java文件,这个文件存储在tomcat/work目录
4. 会将demo1_jsp.java文件编译成demo1_jsp.class文件,服务器会将其加载运行
5. 在jsp页面生成的java文件中就会通过 流 将jsp页面的html代码写回到浏览器端,所以我们在浏览器上就看到了jsp中的html代码显示的效果。
注意:要知道<% %>和<%! %>在jsp“真身”中的位置:
在_jspService()方法中间以 java代码原型存在
JSP脚本:JSP脚本就是Java代码片段,它分为三种:// 明确一点:所有的这些都是 在_jspService()方法内_jspService()内定义了9个:我们俗称的9大内置对象
<%...%>:Java语句;// 方法中能放什么,它就能放什么。
<%=…%>:Java表达式;// 等同于resopnse.getWriter().print()。写到这里的东西,都是用来输出的!
<%!...%>:Java定义 类的成员变量;// 类能包含什么,它就可以包含什么。 声明成员变量的标签 ,注意: 声明标签中 没有9大内置对象!
JSP注释:<%-- jsp注释 不会保留 --%>
Jsp与servlet区别:
Jsp它的主要作用是用于显示数据。
Servlet它的主要作用是用于处理请求完成业务逻辑操作。
2.九大内置对象: // 来历 _jspService()方法内给我们声明了9个:我们俗称的9大内置对象直接在<% java代码 %>中使用
1. application 类型是 ServletContext
2. session 类型是 HttpSession
3. request 类型是 HttpServletRequest
4. pageContext 类型是 PageContext
5. response 类型是 HttpServletResponse
6. config 类型是 ServletConfig
7. page 类型是 Object
8. out 类型是 JspWriter
9. exception 类型是 Throwable
3.四大域对象: // 也是 EL 的内置对象
1.pageContext:它代表的是page域,但是jsp中page它的类型是Object,所以操作page域我们使用的是pageContext对象,page域就是指当前页面范围
2.request : 它是代表整个请求链
3.session: 整个会话
4.application:整个web应用
servlet中有三个域对象:
HttpServletRequest 整个请求链
HttpSession 整个会话
ServletContext 整个web应用。
对于域对象它们都具有以下方法<% java代码 %>
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
4.pageContext对象作用:—————————————— java代码 操作 域/对象 jsp中写java脚本,已被淘汰————————被EL替代
1.获取其它八个内置对象 // 我们在开发中可以将pageContext对象 作为参数 传递到java类中,在java类中就可以 根据需求来 获取想要的web对象。
2.操作page域及其它域 // ~.setAttribute("pname", "pvalue") / ~.getAttribute("rname",PageContext.REQUEST_SCOPE) / pageContext.findAttribute("rname")
// 快速查找: 在 page < request < session < application 范围依次查找,如果没有查找到返回null.
实际开发中用法: ${pageContext.request.contextPath} ==》pageContext.getRequest.getContextPath() ——————> 获取当前工程名
out对象:将信息输出到页面上
out对象它是一个JspWriter,它是一个字符输出流,它的作用就是将信息输出到页面上。
out对象与response.getWriter()区别? //response.getWriter() 输出优先级别 > out
out缓冲区 ————> response缓冲区 ————> 页面 // 真正操作响应正文的其实是response // 在jsp页面上要想显示信息,建议只使用out.
Exception:
它就是一个异常对象,描述的是当前页面产生的异常信息,它只有在 page指令 设置为 isErrorPage 时才会存在。
5.jsp指令:
1. page指令:这个指令用于描述页面的一些特性 <%@page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true" %>
/** page指令中重要属性
import: 用于在jsp页面上使用java类时导入包
encoding: 用于指示jsp页面翻译后的java文件的编码,其实也就是当前jsp页面编码
contentType: 用于指示jsp页面生成的servlet中response获取输出流输出信息的编码
简单说,就是用于设置response.setContentType();
encoding 与contentType属性的关系:
它们互相依赖,只要设置一个,另一个就参考对方值。
language:它代表的是jsp页面上脚本中可以使用的语言
extends:它的作用是指示jsp生成的java类它的父类
session:它的值是true/false,如果是true,代表在jsp页面中可以直接使用session,否则不可以使用。
isElIgnored:它的值是true/false 指示的是jsp页面上是否可以使用el表达式,如果是true,就不能使用el表达式,否则就可以使用.
errorPage 用于设置错误页面,jsp页面如果出现问题,可以直接跳转到errorPage指定的页面
isErrorPage值可以取true/false指示当前页面是一个错误页面,也就是说,取true时可以在当前页面中直接使用jsp内置对象exception,
在开发中,我们一般很少使用 errorPage与isErrorPage,我们一般会使用全局错误页面处理方案:
我们可以在web.xml文件中配置错误页面。
autoFlush与buffer
它是 jsp页面生成的 java文件中out对象默认缓存区大小及是否自动刷新。*/
2. include指令:静态包含。在jsp页面中静态包含一个文件,这个文件可以是任意文件,同时由jsp解析包含文件内容. <%@include file="demo2.jsp" %>
包含操作有什么作用?
使用包含,可以对页面进行布局。// 将两个页面 合并成一个页面
静态包含的注意事项:
1. file属性的值不能是变量
2. file属性值不可以携带参数
3. taglib指令:导入标签库, 如:jstl标签库<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
6.Jsp标签: // 业务逻辑处理 —————— Service层
Jsp中标签也叫jsp action(动作标签),用于在jsp页面中提供业务逻辑处理,避免在jsp页面中书写脚本。
我们现在所说的jsp标签,是jsp页面内置的,可以直接使用。
用于请求转发,它与RequestDispatcher接口中的forward方法一样,唯一不同的就是在jsp页面中使用。 // 避免在jsp页面写<% java代码 %> 在 web.xml
// 的struts核心配置 中开启FORWARD
用于页面传递数据,简单说,就是用于生成参数。
这个标签的作用与jsp中include指令功能是一样的,都是包含操作,只不过我们叫include标签为动态包含。
Jsp中静态包含(include指令)与动态包含(include标签)区别?
1. 静态包含包含的是内容,而动态包含包含的是结果。
2. 静态包含不可以传递参数 ,而动态包含可以传递参数
7.EL表达式:它是jsp内置的一种表达式语言,从jsp2.0开如,就不让再使用java脚本,而是使用el表达式来替换jsp中java脚本。(expression Language)
主要作用是:代替jsp页面上的<%=%>,向浏览器输出数据. eg:${1+2}向浏览器输出3.
格式: ${表达式}
/** 为什么使用el表达式?
主要目的是为了替换jsp页面上的脚本,使jsp更加简单,安全。
EL主要作用:
1. 获取数据(主要是域中数据)
2. 执行运算
3. 获取web常用对象
4. 调用java方法(EL函数)*/
jsp2.0规范 —————— servlet版本是servlet2.4 —————— javaEE1.4
1.El表达式获取数据: // 使用el表达式获取时,如果没有查找到结果, 返回的 不是null, 而是一个 "".
1. page域 ----------------------${pageScope.name}
2. request域 ----------------------${requestScope.name}
3. session域 ----------------------${sessionScope.name}
4. application域----------------------${applicationScope.name}
EL获取域中数据可以省略范围 ${requestScope.rname} --------- ${rname} page > reqeust > session > application 依次查找
在el中使用"."与[]可以实现同样的效果: ${xxxScope.对象.属性} = ${xxxScope["对象"]["属性"]} //——————全都是用名称去找,不要混淆去用getXXX()方法.
问题: .与[]有什么区别? // <%= request.getXXX().getXXX()%> 这里才用java代码
注意: 如果名称中不包含特殊符号,那么.与[]一样,但是如果名称中包含了特殊符号,那么我们就只能使用[].
/** 2. EL执行运算:
在el表达式中可以使用运算符来进行操作
1.算术运算符 + - * /(div) %(mod) ——————取余
对于算术运算符注意+,它永远执行的就是加法运算。
2.关系运算符 >(gt) >=(ge) <(lt) <=(le) == (eq) !=(ne)
执行关系运算它得到的结果就是boolean
3.逻辑运算符
&&(and) ||(or) !(not)
执行逻辑运算得到的结果也是boolean
4.三目运算符
(表达式1)?(表达式2):(表达式3)
它与java中的三元运算符一样。
5.empty
i. 如果是一个普通对象,它判断对象是否为null,如果为null返回true.否则返回false.
ii. 如果是一个容器(数组或集合),它不仅判断对象是否为null,还判断是否有元素。*/
/** 3. EL十一大内置对象:// 我们在el中使用pageContext一般使用:${pageContext.request.contextPath}
pageScope requestScope sessionScope applicationScope
pageContext 它与jsp页面上内置对象pageContext一样。
获取 http请求信息 的6个内置对象:
param: 获取一个Map key就是请求参数名称,value是值
paramValues: 获取一个Map它与request.getParameterMap()结果一样。
header: 获取一个Map它封装的是所有的http请求头信息
headerValues: 获取一个Map它封装的是所有的http请求头信息
initParam 获取一个Map它封装了所有的全局初始化参数
cookie: 获取一个Map 它封装了所有的http请求的中cookie信息,key就是cookie的名称,value就是这个cookie对象。
*/
4.El函数:Jstl标签库,在jstl标签库中有已经定义好的一些EL函数。在jsp页面上要使用EL函数必须导入jstl标签库。
本质是:调用了一个java类的方法。 // <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
注意:如果在开发中,我们使用的不是myeclipse,那么我们在使用el函数时,必须导入jstl的jar包。
因为我们使用的是myeclipse,它会默认导入javaee5.0的库,在这个库中包含了jstl标签库的jar文件,所以不用导入了。
8.JSTL标签库:
8.2.javaWeb设计模式:
jsp设计模式: jsp+javaBean / jsp+servlet+JavaBean // Sun公司在推出jsp后,提供的两种jsp开发模式
//
javaBean介绍: 一个javaBean它应该是具有无参数构造,并且属性private,对外提供get/set方法让其访问,一般javaBean是可序列化,也就是说,它要实现序列化接口。
在javaweb开发中,javaBean的主要功能是什么?
javaBean可以分为两种,一种是用户界面的UI 的javaBean , javaweb中使用的不是这一种。
另外一种它没有用户界面,主要负责处理数据封装,jsp中通常使用的是这一种, 我们在实际开发中,所使用的javaBean主要是用于 将数据进行封装操作。
Beanutils: 我们可以使用beanutils工具来完成请求参数封装。 // 底层是使用java内省机制,而内省它的实现是依赖于java反射。
它是apache开发的一套用于 操作javaBean的API, 通过这套API,可以简化我们操作javaBean代码的编写。
API:
Beanutils.populate(user , request.getParameterMap()) // 参数1:javaBean对象参数2:所有的请求参数的map集合
Web开发的三层架构与mvc区别?// 先架构,再选模式
三层架构它是一个分层式的体系架构设计,它可适用于任何一个项目,MVC它只是一个设计模式,它是根据项目的具体需求来决定是否适用于该项目。
在开发,首要对项目进行架构,在架构以后,我们要根据具体的需求,来选择设计模式。例如mvc 工厂模式等。
MVC设计模式: MVC全名是model view controller
它是一种软件设计典范,用一种业务逻辑,数据,界面分离的方式来组织代码,将业务逻辑聚集到一个部件中,方便程序的重用,提高我们的开发效率。
M:model 即模型层,维护数据提供数据的访问 javaBean // 业务处理: service / dao / POJO
V:view 即视图层 数据的显示 jsp// 显示数据:html / jsp
C:controller 控制层,用于业务处理。Servlet// 接收请求 + 响应结果 :servlet / filter
eg: struts2框架 、 SpringMVC ...
// 注意:Model并不是单纯的指POJO. Model是指业务逻辑处理——————service/dao/POJO/甚至action也可以算model
8.3.i18n国际化: