JavaWeb
1、开发环境搭建
new->other->Server ->Server
new-> other->web->Dynamic web Project (动态web项目)
2、Dao回顾
DAO:工具类、异常类、实体类、DAO中的各种方法
Service:业务逻辑,事务,异常(根据业务场景抛出各种异常)
3、HTTP协议 模式:请求–响应 request-response
请求:
响应:
在请求与响应的过程中,浏览器与web服务器之间有一个协议,HTTP协议,hyperText Translate Protocol超文本传出协议
协议://主机:端口/路径?查询字符串
URL:Uniform Resource Location:对服务器上资源的定位
如:http://www.woniuxy.com/studentcourse/1729
结构:协议://主机:端口/路径?查询字符串
如:http://localhost:8080/woniushap/user/reg.jsp?name=tom&age=21
https://www.baidu.com/s?wd=JDBC&rsv_spt=1&rsv_iqid=0xc1f3e10d00001eed&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=5&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=1977&rsv_sug4=2736
ftp://ftp.woniuxy.com
请求头:
method:一般分为get/post
get: 参数直接更在URL的查询字符串中,相对post不安全
POST:参数会在请求体中,只有在表单提交通过form的属性method=“post”,就是post方法,其他都是get,在文件上传时,一定是用post 不能使用get
使用上:敏感数据,使用post比较适合,查询功能适合使用get(登陆除外)
referer:来源,适合做:防盗链,登录之后会到原页面
user-Agent:获取客户端信息 (浏览器信息)
可以使用Servlet的处理请求方法获取所有的请求头
Enumeration names = request.getHeaderNames();
while(Names.hasMoreElements()) {
String name = names.nextElement();
System.out.println(name + “:” +request.getHeader(name));
}
响应头:
**Status Code:**状态码,常见状态码:404(资源未找到)500(服务器内部错误)200(服务器正常处理请求)403(无权限)400(请求不正确)
客户端数据存储技术之一
**Cookie:(重点理解)**第一次发请求,请求头没有Cookie包含在请求头中,当响应回来时,会产生一个cookie包含在响应头,(存在本地);当再次发生请求时,请求头包含了从服务器端你返回的cookie
思路:请求–响应–》HTTP
URL:
请求头:method,referer,user-agent
响应头:status:200,404,500,403,400,302
Cookie:
HTTP权威指南,开发者看前面几章
HTTP图解
4、Servlet的基本使用
Server let
Applet Application let
运行在服务器端中的一个Servlet容器(Tomcat)中,有容器负责对Servlet实例化及管理
代码实现上:Servlet必须实现Servlet接口,一般继承HttpServlet类,重写doGet与doPost,分别处理get请求与post请求
配置:1,实现注解WebServlet("/path"); path以/开头,且不能重复,这种方式简单**
2,在web.xml中配置,该文件在3.0开始不是必须的**
作用:
1,获取客户端的请求(用户数据,请求头)
2,服务器端数据有效性校验
3,调用业务逻辑方法
4,根据业务逻辑方法返回的的结果或抛出的异常做出合适的响应
避免类爆炸,将相关操作交由一个Servlet处理,使用一个特定的参数(opr)决定是何种操作
http://localhost:8080/test/index.html
http://localhost:8080/test/category
5,中文乱码
1.1 页面上中文内容乱码:编辑器的编码确保是UTF-8,在页面上使用
1.2 Java连接数据库加入数据时:创建数据库时指定编码,UTF8,UTF8MB4,老版本(8之前)JDBC连接字符串指定编码useUnicode=true&chracterEncoding=UTF8
1.3 页面参数传到Servlet中是乱码
get:在地址栏中提交中文参数,在Tomcat的server.xml中,找到Connector标签,增加URIEncoding=“UTF-8”
post:参数再前求体中传,默认的编码 ISO-8859-1 代码 new String(name.getBytes(),“UTF-8”)
在request上使用setCharacterEncoding(“UTF-8”),这句代码一定要在获取参数(getParameter)之前
最佳实践:使用过滤器(Filter)
6,路径问题
绝对路径:适合访问外部站点
相对路径:不以斜线开头,也不一定协议开头,以…/开头,上一层目录开始定位
站点根路径:以/开头
http://localhost:8080/woniushop/category/css/pintuer.css
http://localhost:8080/css/admin.css
7、超连接,传id
Servlet获取到id,进行查询,将数据展示到修改页面
提交修改页面的数据到Servlet进行数据库操作
完成之后转到列表页
8、文件上传:
客户端,HTML中:
1,使用input type=“file”
2, form的属性method=“post” enctype="multipart/form-data"
Servlet:增加注解@MultipartConfig 可以支持multipart/form-data类型的数据
代码:
使用request.getPart()得到代表文件的Part对象,调用其writer(filename),把相对路径存数据库
**带数据用request.getRequestDispatcher 不带数据用response.sendRedirect**
请求–响应
小结:发送请求的方式:
地址栏输入地址
表单 action=“url”
a href=“url”
img src=“url”
link href=“url”
script src=“url”
js:location.href=""
form.submit()
9,如何定位Servlet?
通过@WebServlet(urlPatterrns="") 与请求匹配,匹配上交由该Servlet处理
语法上urlpattern可以是多个
分类:
1.1 精确匹配 以/ 请求的url与Servlet配置的urlpattern完全相同 使用最频繁
1.2 路径匹配 以/开头 以/结尾 代表任意长度字符
@WebServlet("/servlet2/")
@WebServlet("/servlet2/aaa/")
有一个请求:servlet2/aaa/bbb
最长路径匹配原则
1.3 扩展匹配 以*.shtml
注意:路径匹配与扩展匹配不能一起使用
1.4 默认匹配 / 在容器中有一个叫default的Servlet
优先级:精确匹配 》 路径匹配 》扩展匹配 》默认匹配
10,Servlet生命周期(重点)
LifeCycle:从加载Servlet类到销毁结束
Servlet类必须实现javax.servlet.Servlet接口,通常直接继承javax.servlet.http.HttpServlet
类的层次结构:
Servlet:
GenericServlet:
HttpServlet:
自定义servlet
与生命周期相关的方法:
init(ServletConfig)
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
destroy
结论:
10.1 在第一次处理请求时,Servlet会被实例化,紧接着调用init方法进行初始化,使用service方法处理请求
第二次处理请求时,只会调用service方法
destroy:在容器正常关闭或者卸载项目
10.2 在Servlet配置属性loadOnStartup
在容器启动后,将Servlet实例化,调用init方法,
当处理请求时,调用service方法
destroy:在容器正常关闭或者卸载项目
注意:Servlet只会有一个实例
自定义servlet通常直接继承javax.servlet.http.HttpServlet,重写doGet,doPost
处理的请求方法是service方法,该方法在HttpServlet中根据请求的方法调用doGet或doPost
ServletRequest是HttpServletRequest接口的父接口
ServletResponse是HttpServletResponse的父接口
模板方法设计模式
11,补充注解
Annotation Java5新增,目前使用非常频繁
主要作用是使用类似注释的方式,无侵入为现有的类,方法,属性,参数增加功能
定义注解:
@Retention:决定注解信息存储在何处,一般是RetentionPolicy.RUNTIME,能被反射获取到
@Target:决定了注解能使用在什么场景
属性:
数据类型 属性名() default 默认值;
如何使用:
@注解名(属性1=值1,属性2=值2)
属性有默认值,可以不显示赋值
属性是数组,值如果是单个,可以直接赋值也可以使用大括号;如果值是多个,必须使用大括号
属性的名字是value,如果只为属性value赋值,可以省略属性名
扩展:使用反射获取注解的信息
12,@WebServlet配置 使用该注解配置Servlet的信息,包括urlPatterms,name,初始化参数,异步支持
value:与urlPatterns等同
loodOnStartup: servlet会在容器启动后进行实例化和init方法调用
initParams:配置初始化参数,类型是@WebInitParam数组,
asyncSupported:异步支持
@WebInitParam:初始化参数,
name:名字
value:值
13,获取参数:HttpServletRequest接口
用户参数:
文本:
getParameter():得到的单个字符串
getParameterValues();得到字符串数组,通常获取复选框的值,只有被选中的复选框才会传值到后台
如果一个复选框都没选中,则得到的是空对象
二进制:
getPart:
getParts:
请求头:
getHeader
getHeadderNames
13.1HttpServletRequest接口
作用域操作:
setAttribute
getAttribute
getAttributeNames
removeAttribute
字符集
setCharacterEncoding:设置字符串
getCharacterEncoding:或字符串
Cookie操作
getCookies:获取Cookie
会话操作:
getSession;
获取服务端和客户端信息:
getRemoteHost
//补充 getRequestURI
ServletRequest接口是HttpServletRequest的父接口
在使用中,ServletRequest接口的方法可用,则直接用,不能用,则将其强转为子接口HttpServletRequest
14,做出响应:HttpServletResponse接口
14.1 前台重定向与后台转发:
前台重定向:response.sendRedirect(); 导致响应码为302,还有一个location,浏览器识别302位重新发送请求到新的地址location,地址栏会变化
后台转发:request.getRequestDiapatcher().forward(req,resp); 在服务器端找资源,将其作为响应返回到客户端
存在于reqesut作用域中的数据能在页面被访问到,地址栏不会变化
14.2 数据如何共享,作用域(Scope):数据存储的范围
分类:
页面作用域
请求作用域:request.setAttribute() 往请求作用域中存储数据 它只在一次请求响应中可以共享,绝大部分查询适合使用的作用域 主要存储查询的数据
会话作用域:request.getSession().setAttribute 往会话作用域中存储数据 在访问的时间内会话是活动的,与用户相关的,主要存储用户信息,验证码信息
应用作用域:ServletContext 作用域是全局的,所有的用户任何时间都可以访问的数据,可以存储默认分页大小,在线人数,。。。。
在页面使用EL获取作用域中的数据:${expression}
它会从范围小的作用域向大的作用域中找属性
可以使用pageScope,requestScope,sessionScope,applicationScope限定从某个作用域中查找属性
14.3 响应内容的类型:
文本:
页面
数据,JSON,适合处理Ajax
二进制数据:任务,导出 POI,EasyExcel
响应头
js:JSON:parse stringify
java:fastjson JSON.toJsonString()
统一响应格式:
code, msg,data
HttpServletResponse接口代表响应
addCookie:增加Cookie
addHeader:增加响应头信息
getCharancterEncoding
setCharactterEncoding
getWriter:得到PrintWriter用于将数据写入响应中
sendError
sendRedirect
15,会话跟踪
HTTP协议:无状态的协议
当第一次发送请求时,服务器端(容器Tomcat)产生一个Cookie(叫jsessionid=xxxxx),随着响应(响应头)发送到了客户端
当后面再次发送请求(只要是同一个站点)时,浏览器会在请求头中自动带上第一次响应回来的Cookie,将数据存储到服务器端,称之为Session
HttpSeesion:该接口表示会话,有请求接口的getSession获取实例
方法:
setAttribute()
getAttribute()
removeAttribute()
invalidate():将session失效,用于退出系统
默认有效时长是30分钟,可以通过设置改变
web.xml中进行配置,其中的是单位是分钟
<session-config>
<session-timeout>5</session-timeout>
</session-config>
任务:将管理员的退出实现
Cookie:存储在客户端上的一段数据,一般存储用户信息,跟用户相关信息
属性:
name:名字
value:值
domain:域
path:路径
expried/max-age:有效时长
操作Cookie:
js:
Java:
Cookie:构造方法传入name和value,setMaxAge设置最大存活时间
addCookie:增加Cookie
显示:request.getCookies()
找一个EL内置对象,将Cookie的值获取到
URL重写
隐藏表单域
总结:4种
16,过滤器
Filter,一个实现了Filter接口的类,通过配置能够在请求发送到服务器资源之前处理请求与响应
实现Filter接口,使用@WebFilter进行配置
生命周期:在容器启动后直接加载过滤器,实例化,调用init方法进行初始化
任务1:实现一个设置请求与响应编码的过滤器,对所有的请求都起作用
执行原理:理解过滤器练链执行过程
@WebFilter 属性
value urlPatterns:
filterName:实例化时以该属性的值的字母顺序进行实例化
dispatcherTypes:决定那种请求会经过该过滤器,可选的值:
DispatcherType.REQUEST:默认的,直接访问,路径匹配会经过滤器
DispatcherType.FORWRAD:后台转发到的资源,路径匹配会经过滤器
任务2:实现过滤器,实现对后台功能的保护
先对无需登录即可访问的资源放行
需要登录才能访问,对Session中的属性admin进行判断,如果有,放行,否则返回到登录界面
17,包装器
包装器提供对原始请求与响应对象的包装,在包装器作为请求与响应往后传递
HttpServletRequestWrapper
18,监听器
分类:
容器启动完
会话创建:统计在线人数
会话中属性的变化
提供了若干接口:
HttpSessionListener
//TODO 自行查找还有哪些监听器
实现监听器,实现对应的接口,重写对应的方法,使用注解@WebListener修饰
ServletContext:Servlet上下文(环境)
getContextPath
getRealPath
setAttribute/getAttribute/removeAttribute
addXXXX:增加Web组件(Servlet,Filter,Listener)
getInitParameter/getInitParameterNames
19,xml配置和注解
WEB-INF:该目录在站点根目录下,该目录下的文件不允许直接访问,通常放置配置文件
其中有两个特殊的目录:classes(存放class文件),lib(存放jar文件,其中的jar文件自动加到项目的buildpath中)
web.xml:位于WEB-INF根目录,也称为部署描述文件(符),其中可以配置任何项目信息
19.1 配置servet
<servlet>
<servlet-name>xxx7</servlet-name>
<servlet-class>com.woniuxy.Servlet7</servlet-class>
<init-param>
<param-name>a</param-name>
<param-value>aaa</param-value>
</init-param>
<init-param>
<param-name>b</param-name>
<param-value>bbb</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>xxx7</servlet-name>
<url-pattern>/yyy7</url-pattern> 如果请求是yyy7他会交给xxx7,然后找到上面的xxx7找到class
<url-pattern>/zzz7</url-pattern>
</servlet-mapping>
19.2 配置Filter
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.woniuxy.MyFilter1</filter-class>
<init-param>
<param-name>xx</param-name>
<param-value>value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
19.3 配置监听器
<listener>
<listener-class>com.woniuxy.MySessionLisntener</listener-class>
</listener>
19.4 会话超时,单位是分钟,默认30分钟
<session-config>
<session-timeout>5</session-timeout>
</session-config>
19.5 配置全局参数,通过ServletContext中的getInitParanmeter方法
<context-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</context-param>
19.6 配置欢迎欢迎页面,在访问到某个目录时,无需明确页面地址,自动从上往下会找欢迎页面
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
19.7 配置统一出错页面
<erorr-page>
<error-code>404</error-code>
<location>/404.html</location>
</erorr-page>
区别:
1,XML配置,配置信息很集中,容易维护;注解,维护较分散
2,编写:注解使用方便
如何选择:自已的组件(Servlet,Filter,Listner使用注解),其他的配置没有选择,只能使用xml
使用第三方框架,xml是唯一选择
20,JSP执行原理
Java Server Pages
当第一次访问JSP时,容器将JSP翻译为一个Servlet,将Servlet进行编译,加载,实例化,初始化,提供服务,销毁
后续访问,该Servlet直接处理请求
21,语法
1,静态页面内容:HTML标签,css,js,注释
2,JSP指令: <%@ directive attr1=value1 attr2=attr2%>
page: 设置翻译过程中的页面属性 language,contentType,pageEncoding
taglib: 引入标签库 prefix,uri
include:引入其他页面,file
3,Java小脚本:<% java代码 %> 放到翻译后的Servlet的_jspService方法中
4,表达式:在页面输出信息 <%=expression%> 在Servlet中对应out.print(expression);
5,声明:在页面声明变量,方法 <%! int num=10; void print(){} %> 放到翻译后的Servlet类中作为类的成员
6,注释: <%-- JSP注释 --%> 产生的页面是没有该注释
7,表达式语言:${expression}
8, JSP动作(Action), <jsp:include page>引入页面 jsp:param往页面传参数
22,隐式(内置)对象 9个
在JSP中无需显式声明即可使用的对象
request:代表请求
response:代表响应
pageContext:页面作用域
session:会话
application:应用作用域
config:获取配置的参数
out:输出到页面的输出流
page:当前Servlet的实例
exception:代表异常,在页面使用page指令的isErrorPage="true"才有
23,EL,语法
${expression} 将表达式计算的结果输出到页面,会自动从小范围的作用域向大范围的作用域找属性
基本数据类型,引用类型,数组,集合(List,Map)
内置对象:${cookie} ${param}, //TODO 自行整理
24,JSTL
标签库:封装起来的实现了特定功能的Java类,使用标签的方式用于页面
JSP Standard Taglib Libary:官方实现的
第三方:SprngMVC,Struts2.。。。
JSTL分类:
(重点)核心标签库:判断,循环
格式化标签库:数据(日期,数字,货币)格式化,国际化
(几乎不用)SQL标签库:页面练接数据库,执行SQL语句
(几乎不用)XML标签库:页面处理XML
函数标签库:提供对字符串,集合等操作
使用:1,使用taglib指令引入标签库,
属性:prefix,前缀,自定义,使用prefix:tagname</prefix:tagname>
2,在页面使用标签
核心标签库:
forEach:用于遍历或循环 属性:items,var,begin end step
if:属性test,必须的,其值为boolean类型,可能会使用el中的比较和逻辑运算符
and or not:逻辑
empty:空判断,判断作用域中是否存在某个属性
eq ne gt lt ge le:比较
choose:
when:
otherwise:
import:
格式化标签库:
formatDate:属性value,pattern
国际化:i18n internationalization 一套系统在不同的国家和语言环境中自动或手动切换显示的格式,文本
文本的国际化:编写几个不同的资源(一般是属性)文件
name
函数:使用上与其他4个不同,用于表达式中进行运算
提供的功能:对字符串的常规操作,对数组的处理
25,MVC vs 分层
MVC:
Model:模型,为系统提供数据操作的 Service,DAO
View:视图,展示给用户的界面,HTML,CSS,JSP
Controller:控制器,接收请求根据模型的数据操作结果控制做出的响应 Servlet
原则:请求一定交给控制器
视图只做界面的展示
模型负责操作数据,数据需要展示到界面则使用控制器进行共享
好处:各司其职,维护性高
注意:分层与MVC是两个完全不同的概念
典型分三层:
数据访问层:封装操作数据库的方法,不涉及业务,不涉及事务
业务逻辑层:体现两个方面:体现业务逻辑(可能调用多个DAO的多个方法),事务的边界
视图层/表示层/展示层:接收请求作出响应
原则:
层之间的调用,上层调用直接下层,不允许跨层调用或下层调用上层
层之间的数据传递,使用实体类传递
下层出异常上层一定要获捕获
尽可能解耦:下层抛出统一自定义异常给上一层,针对接口编程(第三阶段)
好处:从代码的功能上拆分的
实用:Servlet的实现与配置,获取参数,页面的后台转发与前台重定向 EL ,JSTL(核心标签库)
JSON,Ajax(本周重点)
jQurey
Bootstrap
Ajax
事件注册:addEventListener(“Load/click/change”,function(){})
发送Ajax
DOM:访问元素的属性内容
动态创建或删除元素
Ajax:前后端分离开发的实现技术,Asynchronous JavaScript And XML
jQuery
1、jQuery是一个简化的JS开发的库
2、下载jQuery jquery.com
3、页面引入
4、基本使用
入口:$(function(){})
与load事件在执行时机上的区别:
load:页面的资源全部加装完成后执行
jQuery:页面结构出来之后执行
5、提供的功能
5.1定位元素
$(“selector”):id,class,tag群组,后代,子
使用该方法,获取的元素并不是原生的DOM对象,是一个jQuery对象
操作元素的属性和内容
导航
动态创建/删除元素
事件注册
事件对象
事件传播
事件类型
Ajax