1.浏览器和服务器的数据交互方式
1.超链接:?参数 中文乱码问题(new String(byte[],"utf-8"))
2.表单 :POST方式 中文乱码问题(request.setCharacterEncoding("utf-8"))
3、JS方式:location.href="";替换地址,放在JQuery的事件里
给form表单一个id,JS、jq获取对象.submit() 提交整个表单。可以提交一行数据
5.ajax
$.get(url,[params],[fn],[type]):发送了一个get请求
$.post(url,[params],[fn],[type]):发送一个post请求
支持el 和Java 但不支持jstl,要导包
1.jsp概述:
java server pages: java的服务器页面
本质上就是一个servlet
认为是
在html页面中嵌套java代码
高大上:
将页面的展示和内容的生成相分离
组成部分:
html + java代码 + jsp特殊内容
后缀名:
jsp
观看jsp产生的源码:
tomcat/work下的转后的Java源码和class文件
_jspService方法就是jsp页面的服务方法.
jsp运行在服务器上
jsp的执行流程:
浏览器发送请求(第一次请求该网页 index.jsp)
服务器收到请求(web.xml),在服务器中JspServlet开始执行,
jspservlet将jsp页面转成java文件(index_jsp.java)若数字开头则前面再加"_"
虚拟机将java文件编译成class文件(index_jsp.class)
服务器创建servlet对象,调用service方法(_jspService),生成动态的内容
将动态的内容返回给服务器,
服务器拿到内容之后,组成响应的信息(响应行,响应头,响应体),返回给浏览器
浏览器收到响应之后,解析响应,展示页面
2.JSP的作用:
1.Servlet要展示页面很麻烦,JSP能更好的代替Servlet去展示信息
2.白话:用来接收并且展示Servlet产生的数据(list,对象,字符串,map集合)
3.JSP本质上是一个Servlet,即是Java类。有.java 和.class 存在工作空间work中
在访问页面的时候就给生成。
3.路径问题
浏览器访问服务器要带工程名 表单 超链接 直接地址栏输入
服务器访问服务器 不需要带工程名
4.jsp的执行原理(面试重点):
1.服务器收到请求,找到指定servlet执行(JspServlet)
2.servlet找到对应的jsp文件.将jsp文件变成java文件.并调用编译器编译成class文件, 最终放在了work目录下
3.编译后的class文件会被服务器当做Servlet执行,生成动态的内容,将动态的内容返回给服务器
4.服务器拿到生成的内容,组装成响应信息,返回给浏览器
5.浏览器收到响应,展示内容
5.jsp特有的:
1 jsp的脚本(如何嵌套java代码)
<% java代码片段 %>
java代码片段
最终放在jsp的service方法中
<%= 输出表达式%>
在页面上输出内容的,不能以分号结尾
最终放在jsp的service方法中
相当于执行了 out.print(i+4 );即可以直接使用out.print()
<%! java声明代码 %> 我们不用的
在jsp页面上声明成员的,转换后在Java成员声明位置
例子:
<%=j %> 可以声明到前面,因为转换之后在service中
<%int i = 3; 局部变量
System.out.println(i);
%>
<%=i+4 %>
<%out.print("我是java代码");%>
<%!int j = 4;
void add(){
System.out.print("我是java代码");
}%>
<%out.print(j);%>
2 jsp的注释
html注释
只是不再页面上展示,java源码和html源码都存在
java注释
在java中有,在html源码中不存在
jsp注释
<%-- --%>
只在jsp源码中.
注意:
我们在页面上使用 crtl +shift +/ 注释
3 jsp的指令 (重点)
作用:
声明jsp页面上的一些属性和行为.
格式:
<%@ 指令名称 属性=值 属性=值 %>
三个指令:
page:声明jsp页面上的一些属性和行为
include(★):包含
taglib(★★):导入标签库
注意:
jsp页面中可以使用多个指令,
指令可以出现多次 位置任意,一般都在页面的上面
*page指令:(不用我们写)
重要的属性:
contentType:声明页面的类型,声明响应的编码,且通知浏览器用什么编码打开。设置文件mime类型
pageEncoding:声明页面的编码
import:在jsp页面上导入所需的jar包
contentType和pageEncoding联系:
若两个都使用了,各自使用各自的编码
若只出现一个,两个编码都是出现的这个编码
若都没有出现,使用默认的编码(一般是iso-8859-1)
了解的属性:
language:声明jsp中的脚本的语种. 目前只有一个值 java
buffer:声明当前jsp页面的缓存区的大小. 默认是8kb
autoFlush:是否自动刷新jsp的缓存区. 默认是自动刷新
extends:声明当前jsp转成的java类继承哪个servlet.
session:声明页面上是否可以直接使用session对象(内置对象) 默认是true
isELIgnored:声明页面上是否忽略el表达式 默认不忽略(在页面上可以使用el表达式)
errorPage:当当前页面发生错误的时候,转发到的页面
isErrorPage:是否是个错误页面 默认不是.若声明为true,可以直接使用内置对象(exception)
例子:
<%@page import="java.util.ArrayList"%>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" isELIgnored="false" errorPage="/600.jsp"%>
*include指令: 静态包含(必掌握)
格式:
<%@include file="..." %> 在哪块使用放到哪块,内部访问无需全路径
注意:
静态包含:将被包含的页面内容复制到包含的页面中,一并的编译运行,只生成一个java文件
*taglib指令:
格式: <%@taglib prefix="前缀名" uri="名称空间" %>
jstl :<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
6 jsp的内置对象
为了方便在jsp内部写java代码,把一些常见的对象声明好了,我们在jsp中可以直接使用
9个内置对象(面试中用)
名称 类型
request HttpServletRequest
response HttpServletResponse
out JspWriter JSP字符输出流,写响应体 同 Response.getWrite()
session HttpSession 若指令内设置Session=“FALSE”时 只能用getSession
exception Throwable 异常信息的封装对象,一般不会有,isErrorPage="true"
page Servlet(this) (代表着本页的实例对象)
config ServletConfig
application ServletContext
pageContext PageContext JSP最小的作用域,一般不使用这个作用域存储数据。
注意:
exception 只有页面声明是一个错误页面的时候才可以使用
session 默认可以使用,当页面通过page指令声明 session=false的时候就不能用session
7 jsp的域对象
域对象 作用范围
pageContext 当前页面 一个项目只有一个此对象ServletContext对象
request 一次请求 每个人都有自己的浏览器
session 一次会话 访问一次Servlet就创一对象建一个request对象-- 转发 --响应回来request对象就销毁
application 整个项目 它里面的数据只能再当前页面获取
8 pageContext对象:
①可以获取其他八大内置对象
比如:制作一个工具类,参数是pageContext,可以根据pageContext获取8大内置对象pageContext.request.contextPath()
②可以从别的作用域中查找数据
pageContext.findAttribute(String name); //获取对应的值
先从最小的pageContext作用域中寻找,如果能找到,直接使用
找不到,继续找request,如果能找到,直接使用
找不到,继续找session,如果能找到,直接使用
找不到,继续找application,如果能找到,直接使用
最后都没找到,返回null字符串
③pageContext可以操作其他作用域(了解)
setAttribute()
getAttribute()
removeAttribute();
实例:
在PageContext提供了常量
例如:
PageContext.SESSION_SCOPE session域
上下两句效果完全等价
session.setAttribute("msg2", "33333333333");
pageContext.setAttribute("msg2", "33333333333",pageContext.SESSION_SCOPE);
Session = request.getSession()等同于直接使用域对象session
7.jsp的动作标签(了解)
<jsp:forward> 在jsp页面使用请求转发
<jsp:forward page="...">
相当于<%request.getRequestDispatcher(..).forward(..)%>
<jsp:include> 动态包含
<jsp:forward page="...">
将被包含页面运行后的结果包含了进来.(将所有jsp页面都编译了)
EL
1 不要用数字作为属性名称,比如当做键。
1.作用:替代JSP脚本的(<%= %>)输出 不要用Integer类型Servlet会解析成long 不好用
2.格式:${el表达式}
3.功能:
1.获取域中的数据(重要) request/session/application/pageContext.setAttribute();
*简单数据的获取: Servlet产生的简单字符串
${pageScope|requestScope|sessionScope|applicationScope.属性名(即是键)}
*复杂数据的获取:数组、集合list、Map
获取数组
${pageScope|requestScope|sessionScope|applicationScope.属性名[index]}
获取list
${pageScope|requestScope|sessionScope|applicationScope.list属性名[index]}
注意: el方式获取数组数据和list集合数据是一样的, el中任何的get方式中get可以略
获取map中某个数据
${pageScope|requestScope|sessionScope|applicationScope.map属性名.键名}
${requestScope.msg[1]} ((String[])request.getAttribute("msg"))[1]
${requestScope.list[1]} ((List)request.getAttribute("list")).get(1)
${requestScope.map.B} ((Map)request.getAttribute("map")).get(B)
*对象属性值的获取(对象就是用来封装数据的)
${属性名.属性}
${requestScope.user.name} ((User)request.getAttribute("User")).getName( )
${user.name}
便捷方式 :${属性名}
${msg.[2]}
${list[1]}
${map.B}
便捷属性不指定具体获取谁的哪个作用域属性会从小到大依次去找:
依次从小到大 pageContext,request,session,application 获取指定名称的属性
若找到了则返回,且结束该次查找
若找不到 返回"" (jsp的findAttribute()返回的是null值,el 中但返回的是null字符串)
注意: 属性名中出现".""+""-"等特殊符号时,使用${xxxScopoe["特殊属性名"]}查,不可以用简便方式获取。
2.执行运算
1. + = * / 不论是数值、字符串型的数值、字符型都可运算,但是字符串不行。
${requestScope.a+requestScope.b}---->${a+b}
2.empty(掌握)判断容器长度(0返回TRUE)
对象是否为空(null返回TRUE)
${empty 容器} ${not empty 容器} ${!empty 容器}
${empty 对象} ${not empty 对象} ${!empty 对象}
3.三元运算
${2>1?A:B} 获取A的值
${2>1?"A":"B"} 字符串A
3.获取web常见的对象(重点 **********************************************)
四个域对象
(掌握)pageScope----从pageContext域中获取数据
(掌握)requestScope----从request域中获取数据
(掌握)sessionScope----从session域中获取数据
(掌握)applicationScope----从ServletContext域中获取数据
(掌握)cookie String=对象
(掌握)pageContext ---可以获取当前的项目名 ${pageContext.request.contextPath}
和请求参数相关的el内置对象
(掌握)param String=String 获取表单中提交的数据,做回显:value="${param.cust_name}"
(了解)paramValues String=数组
和请求头相关的el内置对象 String=String
(了解)header String=String
(了解)headerValues String=数组
全局初始化参数的el内置对象
(了解)initParam
掌握的:
★cookie
我们之前操作cookie
Cookie c = new Cookie("lastTime","123123123123");
Cookie c_ = new Cookie("username","tom");
${cookie}获取的时候
相当于将cookie的名称 和cookie对象放入一个map中
{lastTime=cookie对象的地址值,username=c_对象的地址值}
${cookie.lastTime}:获取的指定的cookie对象
对象中有方法:
getName()
getValue()
★获取指定cookie的值
${cookie.cookie的名称.value}
例如:
获取JSESSIONID的值
${cookie.JSESSIONID.value}
获取上次访问时间
${cookie.lastTime.value}
pageContext 用在JSP中可以获取当前的项目名 Servlet重定向中request.getContextPath()获取项目名
<%pageContext.getRequest().getContextpath()%>
${pageContext.request.contextPath}
jstl
1.jsp标准的标签库语言
2.jstl的使用步骤:
1.导入jar包 jstl.jar和standard.jar 但是用myeclipse不用导
2.在页面上导入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.jstl的分类:
core:核心(掌握 if forEach)
fmt:国际化或者格式化(不学了)
sql:和sql相关的(过时了)
xml:和xml相关的(过时了)
函数库(不学了)
4.core:核心(掌握 if forEach)
c:if使用
格式:
<c:if test="el表达式" [var="变量名"]> 变量是表达式的返回值
条件成立的时候输出的内容
</c:if>
c:forEach使用
格式1:
<c:forEach begin="开始" end="结束" step="循环的间隔数" var="给变量起个名称" varStatus="记录循环状态变量">
${变量名 }
</c:forEach>
注意:
varStatus常用属性:
count:记录当前是第几个
first:判断当前元素是否为第一个
last:判断当前元素是否为最后一个
例如:
<c:forEach begin="1" end="10" step="1" var="i">
${i }
</c:forEach>
格式2:高级
<c:forEach items="${el表达式}" var="变量名">
${变量名}
</c:forEach>
例:<%
List list = new ArrayList();
list.add("123");
list.add("456");
request.setAttribute("list",list);
User user1 = new User();
User user2 = new User();
user1.setName("zhang");
user1.setValue("16");
user2.setName("li");
user2.setValue("18");
List list2 = new ArrayList();
list2.add(user1);
list2.add(user2);
request.setAttribute("list2", list2);
Map<String,User> map = new HashMap<String,User>();
map.put("A", user1);
map.put("B", user2);
request.setAttribute("map", map);
%>
<h4>简单的list1</h4>
<c:forEach items="${list}" var="i">
${i}
</c:forEach>
<h4>list存对象</h4>
<c:forEach items="${list2}" var="user">
${user.name}-----${user.value }<br>
</c:forEach>
<h4>map存对象</h4> 底层将其转换为映射形式,获取key 和获取value
<c:forEach items="${map}" var="user">
${user.value.name}-----${user.value.value }<br> 此处的value是user对象
</c:forEach>
c:choose 、c:when 与c:otherwise
扩展
2.javabean
平常编写的实体类 例如:user product类
规范:
1.公共的具体的类 public class
2.字段私有 private int id;
3.提供公共的访问字段的方法 get|set方法
若有get|set方法了,get|set后面的内容称之为bean属性
例如: public getUsername(){}
public getName(){}
注意:username 和 name称之为bean属性
4.必须提供一个无参的构造方法
5.一般该类要实现序列化接口 serializable
3.设计模式:
servlet-缺点:编写页面响应信息麻烦
|
jsp-缺点:维护起来麻烦
|
jsp+javabean: jsp设计模式1 model1(过时了)
jsp:接受请求,处理请求(找到合适javabean去处理请求)
|
jsp+javabean+servlet: jsp设计模式2 model2
jsp: 收集servlet传递数据 展示数据
servlet: 接受页面请求 找到合适javabean去封装并处理
javabean: 封装数据,封装对数据的操作
MVC设计模式一个具体表现
4.MVC设计模式(面试题):
将业务逻辑 数据 和显示相分离的一种思想.
M:model 模型 封装数据 封装对数据的操作 javabean
V:view 视图 展示数据(主要使用jsp) jsp
C:ctrl(controller) 控制 接受请求并响应 servlet