Servlet交互与JSP
主要内容介绍
数据共享与页面跳转
1. 为什么要有跳转:
Servlet需要跳转到其它Servlet中,因为我们需要职责分明,不同Servlet来完成不同的功能
Servlet跳转到JSP中,Servlet输出动态页面实现恶心,咱们需要使用JSP来做页面的显示
2. 为什么要共享:
http是无状态的,因为在不断的跳转过程中我们需要对数据进行共享。昨天咱们已经学习了一个数据共享Session了。
Web页面跳转和信息共享
.Servlet作用域对象
.动态网页:JSP
请求转发(forward)
需求:AServlet中没有做完的事情跳转到BServlet中继续执行
语法:req.getRequestDispatcher(String path).forward(ServletRequest req,ServletResponse resp);
getRequestDispatcher : 获得转发器
path : 跳转到哪里?
特点
转发过程中浏览器地址栏路径没变
只发了一个请求
共享同一个请求(同一个请求对象),在请求中共享数据;
响应由最后一个决定
只能够访问当前应用中的资源,不能够跨域跳转(老师我想跳转到源代码官网去看视频...)可以使用相对路径,不推荐
可以访问WEB-INF中的资源
从html页面跳转到Servlet需要先加上server.xml中的path(如果有),Servlet中的跳转是不需要加的!
疑问: 既然可以访问WEB-INF中的资源了,那怎么之前又说放在里安全呢?
a) 程序没有提供的路径就不能够访问;b) 在跳转之前可以做权限判断
URL重定向(redirect)
需求:AServlet中没有做完的事情跳转到BServlet中继续执行
语法:resp.sendRedirect(String path);
特点: 测试下面每个点请留意浏览器地址栏!!!
浏览器中地址会变,相当于访问了两次
注意: path中应该加上server.xml中的path的值,如果有的话
发送了两个请求
因为是不同的请求,所以不能够共享请求中的数据
最终的响应是由最后一个Servlet决定
可以跨域访问资源(尝试访问itsource.cn)
请求包含(include-不用)
需求:AServlet中没有做完的事情跳转到BServlet中继续执行
语法:req.getRequestDispatcher(String path).include(ServletRequest req,ServletResponse resp);
特点: 基本上和forward一样,只是把两次响应的结果都输出了
常见面试题:
1. 请求转发forward和URL重定向的区别?
回答方式:
① 分别解释各自的定义
② 罗列各自的特点(最好是表格对比)
③ 各自的使用场景(其实也是来源于特点)
2. 两者如何选择?
①如果需要共享请求中的数据,只能用请求转发
②若要访问WEB-INF中的资源 ,只能用请求转发
③若要跨域访问,只能用URL重定向
④请求转发可能造成表单重复提交问题
数据共享与作用域对象
作用域对象意义;web组件之间传递和共享 数据

作用域经典案例(测试)
@WebServlet("/scope/main")
public class MainServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request
if(req.getAttribute("count")==null){
req.setAttribute("count", 1);
}else{
req.setAttribute("count", ((Integer)(req.getAttribute("count"))+1));
}
//session
HttpSession session = req.getSession();
if(session.getAttribute("count")==null){
session.setAttribute("count", 1);
}else{
session.setAttribute("count", ((Integer)(session.getAttribute("count"))+1));
}
//application
ServletContext application = req.getServletContext();
if(application.getAttribute("count")==null){
application.setAttribute("count", 1);
}else{
application.setAttribute("count", ((Integer)(application.getAttribute("count"))+1));
}
req.getRequestDispatcher("result").forward(req, resp);
}
}@WebServlet("/scope/result")
public class ResultServlet extends HttpServlet {protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request
int count1 = (Integer)request.getAttribute("count");
response.getWriter().println("request:"+count1);
//session
HttpSession session = request.getSession();
int count2 = (Integer)session.getAttribute("count");
response.getWriter().println("session:"+count2);
//application
ServletContext app = request.getServletContext();
int count3 = (Integer)app.getAttribute("count");
response.getWriter().println("application:"+count3);
}}
ServletContext对象
- 获得ServletContext对象的方式:

super.getServletContext()
this.getServletContext()
getServletContext()
都是一样的,提示我们这个方法是父类中的
ServletContext中的常用方法
String getContextPath():获取当前应用的上下文路径.
就是 Tomcat/conf/server.xml中的path值
String getRealPath(String path):获取某个资源的绝对路径.
例如获得 : F:\workspace\servlet_jsp\webapp
String getInitParameter(String paramName);全局初始化参数:
先看传统的Servlet的初始化参数:

因为配置在当前ServletContextDemo中,所以只能被ServletContextDemo使用,其他Servlet无法使用.
而在开发中,多个Web组件(Servlet/Filter)可以拥有共同的初始化参数,此时只能配置N次,不利于维护.
解决方案:使用全局的初始化参数,Web组件都可以共用,配置问web.xml文件中.

面试题1:
req.getParameter("")和req.getAttribute("")的区别?
req.getParameter :用户传过来的
req.getAttribute :从作用域里拿的(必需是放到作用域里的)
面试题2:
ServletConfig.getInitParameter
application.getInitParameter 有什么区别
ServletConfig.getInitParameter 只作为于一个Servlet
application.getInitParameter 整个应用都可以拿到
配置的不同
JSP原理分析(第一个JSP页面) 一个jsp其实就是一个Servlet;
动态网页:JSP
- Java Server Pages:Java的服务网页(Java动态网页)
从访问方式来看:
html, 通过tomcat和直接访问效果是一样的
jsp 如果直接放在浏览器中显示源码,通过tomcat获得是正常内容
jsp运行在服务器中
访问方式 : http://localhost/xx/hellojsp/Hello.jsp

JSP三大指令
page指令: 设置当前JSP配置信息.
errorPage="/myerror.jsp" :如果当前页面出错,就跳转到对应的页面
isErrorPage="true" :这个页面是否是错误页面(当我们要在页面上直接使用exception的时候就可以加上它)
演示1: 局部错误页面跳转

演示2: 全局错误页面
在项目的web.xml中配置

include指令: JSP包含其他文件.

:taglib指令: 引人标签库.
JSP九大内置对象和四大作用域对象



application
JSP语法
- 注释
- <!-- html注释--> 直接写html注释,会输出到页面上让用户看到
- <%-- jsp注释--%> 用户从页面上是看不到的
2.输出数据到页面 <%=hello%>
3. JSP中的Java脚本片段 <% 语句1;语句2;%>
4.定义类的成员<% String str; void testMethod(){} %>
Servlet交互与JSP的更多相关文章
- Servlet转发到JSP页面的路径问题
一.现象与概念 1. 问题 在Servlet转发到JSP页面时,此时浏览器地址栏上显示的是Servlet的路径,而若JSP页面的超链接还是相对于该JSP页面的地址且该Servlet和该JSP页面不在同 ...
- Servlet交互【重定向 与 请求分派】详解
Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...
- jsp、jQuery、servlet交互实现登录功能
做一个web项目,往往需要有一个登录模块,验证用户名和密码之后跳转页面.为了实现更好的交互,往往需要用到 jQuery 等实现一些友好提示.比如用户名或者密码输入为空的时候提示不能为空:点击提交的时候 ...
- 一口气从CSS讲到Servlet再到JSP、Struts2,清蒸JavaWeb的前前后后。
B/S系统就是Browser/Server,浏览器/服务器系统,即,客户在浏览器操作,而代码实现的具体处理以及数据库操作等,则由后台服务器来完成,男耕女织,相得甚欢.比如我们查询成绩,我们通过浏览器输 ...
- ajax和servlet交互,表单日历插件,表单验证,form.js
我的index.jsp <body> <a>点我获取数据</a> <table border=1px> <tr> <td>ID& ...
- ajax和servlet交互
网上有比较多的教程来将如何实现ajax与servlet的交互了,这里和这里的教程可以参考参考,在此处我只简单说明一下,并记录一下我这次遇到的问题. 整个思路是:写个js函数,在里面使用XHR(ajax ...
- servlet跳转jsp
ackage com.monkey.servlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; im ...
- Servlet中获取JSP内置对象
方便自己查询,嫌低级的勿喷.... 1.request 在servlet的doGet和doPost的参数中就有HttpServletRequest req参数,而JSP内置request对象就是Htt ...
- 控制所生成的servlet的结构: JSP page指令
在JSP中,主要有3种类型的指令:page, include和taglib.page指令允许我们通过类的导入.servlet超类的定制.内容类型的设置.以及诸如此类的事物来控制servlet的结构.p ...
随机推荐
- djiango web 在进入admin的时候出现'set' object is not reversible错误
解决方案是在你的urls.py 中 把{ } 改为[] 原因不详 治标不治本,并不能改的东西
- git修改提交的用户名
场景分析 试想一下这样的场景,你先在自己的电脑上上创建了一个项目,并且把他添加到了git仓库,然后提交到了Github.但是,下一次,你在公司的电脑上clone了这个项目,并且修改了文件,当你提交到G ...
- xCode 升级9.3之后巨卡
因为项目要适配iPhone8, iPhoneX 等.需要升级Xcode需要升级到9.3.但是 MAC系统是10.12的,需要升级到10.13. 系统升级完之后升级Xcode.之后Xcode 就各种卡. ...
- PHP之后期静态绑定
PHP后期静态绑定的(late static bindings) 理解PHP延迟静态绑定 static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名.这个东西可以实现在父类 ...
- MySQL数据类型之字符串类型
CHAR(M) 分配固定长度的空间建(字节) VARCHAR(M)按照实际长度存储(占用的字节数是实际的长度加上1或者2)当M的值小于255时,加一. 当M的值大于255时,小于65532时,加 ...
- Linux下稀疏文件的存储方式
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- DOM节点的基础操作
1.寻找节点 //寻找节点 id方法 document.getElementById(); //标准 //寻找节点层次方法 parentNode().firstChild()和lastChild(): ...
- [daily][mariadb][mysql] mariadb快速设置
参考: https://wiki.archlinux.org/index.php/MySQL 1. 安装 使用pacman常规安装 2. btrfs 禁用CoW mariadb的数据文件如果存储在bt ...
- [skill][graphviz] 到底用什么画图: graphviz/inkscape/yed
官方教程文档:http://www.graphviz.org/pdf/dotguide.pdf 一:在文档里抄一个简单的例子 /home/tong/Src/copyright/onescorpion/ ...
- delphi加载ADOQUERY
CxgridDBTableView3.ClearItems;//这里是cxgrid的表层,先清除之前的列再创建 for I:=0 to adoquery1.FieldCount-1 do begi ...



