内置对象***
作用域对象:pageContext、request、session、application。
其它:out、response、config、exception、page
pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象 request HttpServletRequest 一次请求访问的多个资源(转发) session HttpSession 一次会话的多个请求间 application ServletContext 所有用户间共享数据 response HttpServletResponse 响应对象 page Object 当前页面(Servlet)的对象 this out JspWriter 输出对象,数据输出到页面上 config ServletConfig Servlet的配置对象,获取web.xml的配置参数 exception Throwable 异常对象,默认不识别,只能用在错误页面 https://blog.csdn.net/qq_40587575/article/details/79810019
-
out:
<%="a" %> 等价于 <%out.println("a")%>
-
exception:
- 错误页面:需要在page指令中设置,errorPage="true"设置当前页面为错误页面。
只有设置了errorPage=“true” 才能使用exception对象。
web.xml欢迎界面
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>week04</display-name>
<!-- 元数据 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>修改为
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
登录逻辑实现
login.jsp
<body>
<form action="doLogin.jsp" method="post">
用户姓名:<input type="text" name="name" placeholder="请输入您的名称"><p>
用户密码:<input type="password" name="pwd"><p>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
doLogin.jsp
<body>
<%!
String uname = "admin";
String passwd = "123";
%>
<%
//设置编码格式
request.setCharacterEncoding("UTF-8");
//获取提交参数
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
//登录验证
if(uname.equals(name)&&(passwd.equals(pwd))){
//out.print("success");
response.sendRedirect("success.jsp");
}else{
//out.print("fail");
//response.sendError(444, "错误");
//response.sendRedirect("fail.jsp");
request.setAttribute("msg", "用户名或密码有误。。。");
request.getRequestDispatcher("fail.jsp").forward(request, response);
}
%>
</body>
首先显示login.jsp登录页面填写信息,数据提交给doLogin.jsp页面,判断产生两个分支,成功跳转到success.jsp,失败跳转到fail.jsp。
页面跳转–重定向和转发
重定向:response.sendRedirect(“fail.jsp”);
转发:request.getRequestDispatcher(“error.jsp”).forward(request, response);
重定向和转发的区别***:
重定向:获取不到请求数据(不共享),多次请求–>setAttribute(key,value)的值;
地址栏发生变化;
重定向是客户端的跳转,两次请求
转发:可以获取到请求数据(共享),因为只有一次请求–>setAttribute(key,value)的值;
地址栏不发生变化,显示的页面内容属于;
转发是服务端的跳转,一次请求
面试: |
---|
1、重定向是浏览器发送请求并受到响应以后再次向一个新地址发请求;转发是服务器受到请求后为了完成响应转到一个新的地址。 |
2、重定向中有两次请求对象,不共享数据;转发只产生一次请求对象且在组件间共享数据。 |
3、重定向后地址栏地址改变;而转发则不会。 |
4、重定向的新地址可以是任意地址;转发的新地址必须是同一个应用内的某地址。 |
转发只能在服务器的内部进行操作,重定向可以定向到任何的资源 |
解释一
转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次request,
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
例子:
请求转发是服务器内部把对一个request/response的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。
解释三
假设你去办理某个执照,
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
https://www.cnblogs.com/wrencai/p/9054664.html
https://blog.csdn.net/liubin5620/article/details/79922692?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3
https://blog.csdn.net/weixin_40001125/article/details/88663468
会话跟踪技术:在一个会话的多个请求中共享数据
http是一个无状态协议,服务器不会自动保存每次请求的状态信息,但HTTP协议中可以使用Cookie来完成会话跟踪。在JavaWeb中,使用session来完成会话跟踪,session底层依赖Cookie技术。
实现技术:session、隐藏域、重写url,cookie
session,会话,基于cookie实现 。最大非活动间隔时间,默认1800秒
一个会话就是浏览器与服务器之间的一次通话
会话可以在多次请求中保存和使用数据
隐藏表单域
一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:
<input type="hidden" name="sessionid" value="12345">
这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。
重写URL
在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。
<!-- 重写URL -->
<br><br>
<a href="session.jsp">测试URL重写</a>
<br><br>
<a href="<%=response.encodeURL("session.jsp")%>">测试URL重写</a>
相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。
https://www.cnblogs.com/pomer-huang/archive/2018/04/29/8972058.html
https://blog.csdn.net/qq_33098039/article/details/78184535
作用域对象***:PageContext/request/session/application
其作用就是为了在一定范围内共享数据
可以把提示信息放在作用域对象中
作用域对象都有**setAttribute(key,value)、getAttribute(key)**等方法
public void setAttribute(String name,Object o) , 设置属性名和属性值;
public Object getAttribute(String name) ,根据属性名,获取对应的属性值;
public void removeAttribute(String name) , 根据属性名,删除对应的属性值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziCFpWFx-1594626945791)(C:\Users\李丽萍\Desktop\Java第二阶段\JavaWeb第二阶段\笔记\作用域.jpg)]
作用域范围:
page 作⽤域:对应的内置对象是 pageContext。
request 作⽤域:对应的内置对象是 request。
session 作⽤域:对应的内置对象是 session。
application 作⽤域:对应的内置对象是 application。
作用范围: page < request < session < application
page 只在当前⻚⾯有效。
request 在⼀次请求内有效。
session 在⼀次会话内有效。
application 对应整个 WEB 应⽤的。
page域指的是pageContext.
request域指的是HttpServletRequest
session 域指的是HTTPSession
application 域指的是ServletContext,他们都是域对象,原因就是他们都内置了map集合,都有setAttribute getAttribute方法。而且他们的name都是String类型,而value都是Object类型。
page:jsp页面被执行,生命周期开始,jsp页面执行完毕,生命周期结束。
request:用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束。
session:用户打开浏览器访问,创建session(开始),session超时或被声明失效,该对象生命周期结束。
application:web应用加载的时候创建。Web应用被移除或服务器关闭,对象销毁
https://www.cnblogs.com/Gandy/p/7382278.html
-
**pageContext:**当前页面有效
- 注意:使用指令包含时,被包含页面和包含页面使用的是同一个pageContext对象。
- 特殊性:访问其它对象的数据,可以获取其它8个任意的对象。
pageContext.findAttribute("") 从小到大的范围查找,以找到的第一个为准(key相同时)
-
**request:**在⼀次请求(只要地址栏不变)内有效,一次请求可以经过一个或多个页面
动态页面包含时,request可以取到被动作包含页面内所请求的值
转发后的页面中可以取到转发页面的数据
-
**session:**在⼀次会话内有效,一个浏览器窗口的交互
-
**application:**整个应用服务器(Tomcat),共享一个对象
模式:
-
model I:JSP+JavaBean
-
model II:JSP+Servlet+JavaBean(MVC)
JavaBean:
狭义:数据Bean,封装数据,属性和对应属性的getter())和setter()方法
广义:java类,实体类、业务类、DAO类,统称为JavaBean
<!-- User user = new User(); -->
<jsp:useBean id="user" class="com.wdzl.entity.User"></jsp:useBean>
<!-- user.setUsername(request.getParamenter("username")); -->
<jsp:setProperty property="username" name="user" param="username"/>
<!-- 自动给实体类对象所有的属性赋值:前提是页面表达名字和实体类属性一致 -->
<jsp:setProperty property="*" name="user"/>
MVC( Model View Controller) :
Model II----JSP+Servlet+JavaBean -----Struts1 Struts2(WebWork)、SpringMVC
MVC是一种高频的设计模式
M: Model 模型 -----JavaBean(实体类、业务类、DAO类等): 业务和数据处理
V: View 视图 ------JSP(HTML) -----------------: 展现数据、收集数据
C: Controller 控制器------Servlet ------------------:接收请求 调用业务 跳转
优点:
MVC 使用控制层(Servlet),分离了视图(JSP)和模型(JavaBean)
1.降低耦合,有利于扩展和维护
2.有利于分工,专心业务缺点:
构建相对复杂,适用于大型项目,小型项目繁琐。
优点
耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可
重用性高
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap)。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
生命周期成本低
MVC使开发和维护用户接口的技术含量降低。
部署快
使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
有利软件工程化管理
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
缺点
没有明确的定义
使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。
不适合小型,中等规模的应用程序
花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
增加系统结构和实现的复杂性
对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
视图与控制器间的过于紧密的连接
视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
视图对模型数据的低效率访问
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
一般高级的界面工具或构造器不支持模式
改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难。
Session***:
使用会话对象session实现
一个会话就是浏览器与服务器之间的一次通话
会话可以在多次请求中保存和使用数据
方法:
常用方法: |
---|
public long getCreationTime():返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起 |
public String getId():返回session对象的ID,一个session一个id |
public long getLastAccessedTime( |