B/S架构的特点:基于请求和响应
Web服务器的功能:
接受请求
查找资源,处理请求
返回结果
Tomcat:
Tomcat目录结构:
bin:放置控制Tomcat运行的命令(shutdow.bat,startup.bat)
conf:放置的是Tomcat的配置文件,需要改变Tomcat运行环境的时候需要修改这些配置文件(server.xml,web.xml,context.xml)
lib:防止Tomcat在运行的时候使用的和可以支持的jar文件
logs:放置日志
temp:临时文件
webapps:放置应用程序
work:放置web应用程序的转换代码
Tomcat运行方式:
简单的方式-->可以直接通过Eclipse的配置来管理
Eclipse的配置方法:
(1)配置服务器环境
(2)部署项目到服务器
注意:web项目的目录结构:
WebRoot目录:web访问的跟目录
WEB-INF目录:大小写固定不能更改
lib目录:放置运行时需要的jar文件
web.xml文件:配置当前应用程序的环境
(3)部署应用程序到Tomcat的webapps目录下
(4)运行服务器,访问应用程序
访问服务器的路径:http://localhost:8080/
访问服务器资源:
http://localhost:8080/项目名/资源名
jsp页面的处理过程:
(1)第一次访问
xx.jsp-->xx_jsp.java-->xx_jsp.class
由tomcat服务器负责代码的转换,以及负责实例化xx_jsp.java对象并且调用xx_jsp.java中的xxService方法
(2)第一次之后再次访问
直接访问xx_jsp.class
由tomcat服务器负责实例化xx_jsp.java对象并且调用xx_jsp.java中的xxService方法
注意:两次的产生的对象是同一个,因为tomcat采用单例模式来处理对象的生成
JSP的组成:
1、jsp指令:以“<%@ ” 开始,以“%> ” 结束。一个jsp页面至少需要一个指令:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
page指令:表示当前页面默认运行环境
除了page指令外还有include和taglib指令
include指令:包含指令,可以使当前页面可以包含其他页面内容
taglib指令:引入标签库指令
2、表达式:<%=Java表达式 %>-->页面输出
<%=Java表达式 %>等同于out.println();
注意:不要加分号
3、小脚本:<% Java 代码 %>
存在于jsp编译的后java中的service方法中
所以可以放置:变量的定义必须赋值,变量的使用,方法的调用,程序逻辑
4、声名:<%! 方法 %>
存在于jsp编译的后java中类中不在任何方法里
所以可以放:变量的定义,方法的定义,块的定义
5、动作:“<jsp: 动作名 ” 开始,以“</jsp:动作名>
a、<jsp:forward>跳转地址</jsp:forward>:请求转发
b、<jsp:include>包含地址</jsp:include>:引如入其他页面内容到本页面
<jsp:include>:动态引入,引入动态页面(.jsp),原因是引用页面和被引用页面会生成不同的java文件,可以使用同名变量,编译速度慢
<%@ include %>:静态引入,引入静态页面(.html),原因是生存
java文件会把所有的页面(引用和被引用的页面)都包含
在一起,所以不允许出现同名变量定义,编译速度快
c、一组<jsp:useBean>....:处理javabean
6、注释:
a、HTML注释:会出现在被编译后的java代码中,也会出现在客户端
b、JSP注释:不会出现在被编译后的java代码中,不会出现在客户端
c、java注释:会出现在被编译后的java代码中,不会出现在客户端
JSP的javaBean的操作动作
<jsp:useBean>
<jsp:useBean id="" class="" scope="page"></jsp:useBean>
id:实例化后的对象名
class:javaBean的完整路径
scope:javaBean对象的存储范围
作用范围:
page:只在本页面有效
request:在一个请求中有效
session:在一次会话中有效
application:在一次服务有效
useBean运行原理:先检查对应作用域中是否已经存在有实例化的对象,如果存在,直接使用已经存在的实例,如果没有在根据class中的路径,实例化新的对象,再把新对象存如作用域
<jsp:setProperty>
写法1:
<jsp:setProperty name="" property="" value=""/>
name:javabean的对象名
property:name属性名会通过反射找到对应的set方法进行赋值
value:存的值
写法2:
<jsp:setProperty name="stu" property="*"/>
注意:要求表单控件的name属性值必须和 javabean属性值一一对应
写法3:
<jsp:setProperty name="stu" property="name" param="sname"/>
name:javabean的对象名
property:javabean的属性名
param:表单控件的name名称
<jsp:getProperty>
回顾:
JSP动作:
javabean操作:
<jsp:usebean>:实例化javabean
<jsp:usebean id="实例名" class="类的完整路径" scope="实例的作用域">
原理:首先先检查scope是否已经存在需要实例化的对象,如果存在直接从作用域中获取,如果不存在,在通过class属性来实例化新对象,然后,再把实例化后的新对象存入scope中的作用域中.
scope属性的值:
page:只在本页面
request:只在一次请求
session:只在一次会话
application:只在一次服务
<jsp:setproperty>:给javabean的属性赋值
方法一:在确定的知道往javabean的属性中存储的值
<jsp:setproperty name="实例名" property="javabean的属性名" value="确定的值">
方法二:在进行表单提交的时候,需要把表单中的数据赋给javabean的属性
<jsp:setproperty name="实例名" property="*">
前提是:表单中的各个控件的name值要和javabean的属性值一一对应
方法三:在进行表单提交的时候,需要把表单中的数据赋给javabean的属性
<jsp:setproperty name="实例名" property="javabean的属性名" param="控件的name值">
前提是:表单中的各个控件的name值要和javabean的属性值不是一一对应
<jsp:getproperty>:从javabean的属性中获取值
<jsp:getproperty name="实例名" property="javabean的属性名">
页面操作:
<jsp:forward>:请求转发,页面跳转
<jsp:include>:页面包含
<jsp:param>:页面跳转或者页面包含
中的参数设置
<jsp:param name="key值" value="value值">
关于上一页和下一页的问题:
select *,row_number() over (order by nid) as row from news
目标:
JSP隐式对象:在JSP操作中可以直接使用而无须实例化的对象
所有的实例化对象都是由容器产生的,而无须程序员来实例化,隐式对象只能在JSP页面中使用.
九大隐式对象:
page:本页面
常用方法:调用Servlet中定义的方法
来源:javax.servlet.jsp.HttpJspPage
request:请求
常用方法:
getParameter():从表单获取值
getParameterValues():从表单获取多选按钮
setCharacterEncoding():设置请求中的编码格式
setAttribute():在请求中存储对象
getAttribute():从请求中获取对象
来源:javax.servlet.http.HttpServletRequest
response:响应
常用方法:
addCookie():把COOKIE数据存储到客户端
void addHeader():设定客户端头信息
encodeRedirectURL():URL重写
sendRedirect():重定向
进行页面跳转,地址栏会发生变化
重定向不能使请求延续
来源:javax.servlet.http.HttpServletResponse
session:会话,区分不同用户
常用方法:
setAttribute():在会话中存储对象
getAttribute():从会话中获取对象
getId():获取sessionID号
getLastAccessedTime():当前用户的最后访问时间
getMaxInactiveInterval():获取用户的失效时间
setMaxInactiveInterval():设定用户的失效时间
invalidate():使session立即失效
isNew() :当前session是不是新session
session的默认失效时间是30分钟
来源:javax.servlet.http.HttpSession
application:服务,使用户共享
常用方法:
setAttribute():在服务中存储对象
getAttribute():从服务中获取对象
来源:javax.servlet.ServletContext
out:输出
pageContext:可以控制page/request/session/application
config:配置信息
exception:异常
回顾:
九大隐式对象:
request:请求
javax.servlet.http.HttpServletRequest
session:会话
javax.servlet.http.HttpSession
application:服务
javax.servlet.ServletContext
response:响应
javax.servlet.http.HttpServletResponse
out:输出
javax.servlet.jsp.JspWriter
pageContext:上下文
javax.servlet.jsp.pageContext
config:配置
javax.servlet.ServletConfig
excetpion:异常
java.lang.Exception
page:本页面
javax.servlet.jsp.HttpJspPage
目标:
Servlet
什么是Servlet?
Servlet本身就是一个普通的java类,我们编写的Servlet类要求继承Servlet类,就是jsp页面编译后的结果
为什么要使用Servlet?
JSP开发的两种模式:
MODEL1:xx.jsp-->xx_do.jsp-->yy.jsp-->yy_do.jsp...
用来作显示或者接受数据以及业务处理都是由jsp页面来完成
MODEL2:xx.jsp-->servlet1-->yy.jsp-->servlet1...
用来作显示或者接受数据由jsp页面来处理,业务处理都是由servlet来完成
怎样使用Servlet?
步骤:
(1)编写一个类必须继承HttpServlet类
(2)重写service或者do_Get和do_Post方法
(3)配置web.xml文
件来进行访问的设置
<!-- 实例化Servlet -->
<servlet>
<servlet-name>demoServlet</servlet-name>
<servlet-class>com.svse.servlet.DemoServlet</servlet-class>
</servlet>
<!-- 通过什么方式访问Serlvet -->
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demoServlet</url-pattern>
</servlet-mapping>
Servlet的生命周期?
回顾:Servlet
(1)两种开发模式的区别?
Model1:接受数据,显示数据以及业务处理都由JSP页面来完成
Model2:接受数据,显示数据由JSP完成,业务处理由Servlet来完成
(2)什么是Servlet,Servlet在开发模式中的作用?
Servlet是一个普通的java类,这个java类是由服务器实例化以及调用其中的方法.Servlet来完成业务处理.
(3)怎么编写Servlet?
a.编写java类来继承HttpServlet的类
b.重写HttpServlet中的Service或者doGet和doPost方法
c.在web.xml文件中进行配置
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattan>/...</url-pattan>
</servlet-mapping>
(4)Servlet的生命周期?
a.服务器加载Servlet,实例化对象
b.调用Servlet中init方法(只在第一次访问的时候实例化)
c.调用Servlet中的Service或者doPost和doGet方法(每次有请求的时候都会调用)
d.调用Servlet中的destory方法(在服务器被关闭的时候会调用)
e.服务器会销毁Servlet的对象
目标:会话管理
服务器和客户端的通信方式:
HTTP协议是无状态的协议:服务器无法区分,每次发送请求的客户端是新的还是旧的.
a.Session方式
第一次访问:客户端在向服务器发送请求的的时候,服务器会为客户端创建一个标识(sessionid),把这个表示存放在服务器的内存中,再对用户的请求进行处理,处理完了后响应用户,除了把资源响应给用户外还会把sessionid发送给用户,并且存储在客户端.
第一次之后访问:客户端先检查自己这端是否保持过sessionid,如果有,再请求的时候除了发送请求的信息还会把sessionid一起发送给服务器,服务器在接受请求的时候会同时拿到一个sessionid,在内存的sessionid列表中进行比较,如果存在表示这个用户原来是访问过本服务器的,如果不存在,服务器再为这个用户创建新的sessionid并且存入内存中,然后在响应时候再把这个sessionid发送给客户端...
session的操作:
1.Sessoin如何实例化:
request.getSession()和request.getSession(true)
2.常用的方式和属性:
getId()/isNew() /getCreationTime()/getLastAccessedTime()/getMaxInactiveInterval()/session.getMaxInactiveInterval()/getAttribute() /setAttribute()
注意:要使session有效必须要先使Cookie有效
b.Cookie方法
分类:
瞬时Cookie:存储sessionid的Cookie,浏览器关闭存储sessionid的Cookie就失效
持久Cookie
操作:
a.实例化C
ookie并且存储信息?
Cookie cookie = new Cookie(key,value)
b.怎么设置Cooie的有效时间?
cookie.setMaxAge(1800);
c.怎么把数据保持在客户端?
response.addCookie(cookie);
d.怎么获取存储在客户端的Cookie信息?
Cookie[] cookies = request.getCookies();
c.URL重写方式
d.隐藏域方式
回顾:
会话管理:服务器如何区分不同用户的请求
服务器无法区分用户,原因是HTTP协议是一种无状态的协议.
会话管理所采用的方法:
(1)session
session有效,前提是客户端的cookie必须是开启状态。
session的原理:
第一次发送请求的时候,服务器接受到请求后,创建session对象,在创建session对象的同时会在服务的sessionid列表中搜索有没有该用户的sessionid,如果没有就在内存中生成一个新的sessionid保持,在发送响应的时候把sessionid传递该客户端,保存在客户端的cookie中.
第一次之后发送请求的时候,客户端会在cookie中搜索自己的sessionid并且通过请求把sessionid发送到服务器,服务器接受到请求后,创建session对象,在创建session对象的同时会在服务的sessionid列表中搜索有没有该用户的sessionid,如果搜索到同样的sessionid,说明该用户以前访问过本服务器.
session对象的创建和一些常用方法
(2)cookie
分类:
1、瞬时cookie,用来存储sessionid,浏览器一旦关闭此cookie自动清空.
2、持久的cookie,用来长期在客户端存储数据
,在关闭浏览器的情况下,数据不会马上消失.
持久的cookie使用:
a.存储信息
Cookie cookie = new Cookie(key,value)
cookie.setMaxAge(秒)
response.addCookie(cookie)
b.获取信息
Cookie[] cookie = request.getCookies();
遍历数组
cookie.getValue()/cookie.getName()
(3)URL重写
(4)隐藏表单域
作业提示:
判断session中是否存在map,如没有存在map说明是第一次购买,那么就新建一个map,如果有说明说明已经在购车中存储过内容,那么map就通过session来获取.
Map(商品名,商品价格)-->充当购物车
发送请求的时候检查map中的key是否有同名的商品名
(1)有的话:就对map进行修改
(2)如果没有:就对map进行添加
map操作完毕,存储到session
目标:
(3)URL重写:实现的前提是,一定在cookie不可用的情况下.
没有禁用Cookie的时候:
http://localhost:8080/lesson8/main.jsp
禁用Cookie的时候:
http://localhost:8080/lesson8/main.jsp;
jsessionid=330CB6E2BE78CDB86DD4AE1C32372A65
(4)隐藏表单域
<input type="hidden" name="" value="">
EL表达式:在页面上使用来代替java代码,主要实现取值的功能
结构:${EL表达式}
功能:
1、基本运算
2、可以从作用域取值 *
${作用域中的key}:
会从最小的作用域开始搜索数据,一但搜索到数据就提取出来,不再继续搜索其他作用域.
${作用域.作用域中的key}例如:
${applica
tion.作用域中的key}错误!!
${applicationScope.作用域中的key}正确!!
3、javaBean中取值 *
${作用域.作用域中的key.javabean的属性名}
4、从表单提交请求中取值
${param.表单控件的name属性值}
5、从数组或者集合中取值
${作用域.作用域中的key[下标]}
6、EL不会显示null值
问题:EL获取Map中的内容?
EL的缺点:
无法实现程序逻辑,条件或者循环语句无法实现
java免费学习资料直播公开课加老师QQ578024144