Servlet跳转与上下文
- 格式:ppt
- 大小:429.00 KB
- 文档页数:27
struts1和strtus2的区别1、Action类Struts 1的Action类扩展一个抽象基类。
在Struts 1是一个常见的问题抽象类而不是接口编程。
Struts 2的行动可能实现一个Action接口,连同其他接口,使可选和定制的服务。
Struts 2中提供了一个基础ActionSupport类实现常用的接口。
虽然,Action接口不是必需的。
任何的POJO对象与一个执行签名可以用作Struts 2的Action对象。
2、线程模型Struts 1的动作是单身,必须是线程安全的,因为只会有一个类的一个实例来处理所有的请求,该行动。
的单身战略名额限制什么可以做Struts 1的操作和发展,需要格外小心。
Action 资源必须是线程安全的或同步的。
在Struts 2 Action对象为每一个请求实例化,因此没有线程安全问题。
(在实践中,servlet 容器会产生许多被丢弃的对象,每个请求,以及一个新的对象并没有对性能上的损失或影响垃圾收集)。
3、Servlet的依赖Struts 1的操作的servlet API的依赖,因为HttpServletRequest和HttpServletResponse被传递给execute方法的调用时采取行动。
Struts 2的动作没有连接到容器中。
最经常使用的servlet上下文被表示为简单的地图,让行动单独测试。
Struts 2的动作仍然可以访问原始的请求和响应,如果需要的话。
然而,其他建筑元素减少或消除的,需要访问HttpServetRequest直接或HttpServletResponse的。
4、可测性测试Struts 1行动的主要障碍是execute方法暴露了Servlet API。
一个第三方扩展中,Struts TestCase中,提供了一组Struts 1的模拟对象。
Struts 2的动作可以测试通过实例的操作,设置属性和调用方法。
依赖注入的支持也使测试更简单。
1 _____和_____标签用来定义表格的行和单元格。
<td> <tr>2表格的_____和_____属性用于水平和垂直合并单元格。
Colspan rowspan3表单主要由_____、_____和_____三部分构成。
表单标签表单域表单按钮4_____标签定义浏览器不支持框架时显示的内容。
<noframes>5 CSS样式由_____、_____、_____三部分组成选择符属性属性值6常用的选择符主要有三类:_____、_____、_____ HTML选择符ID选择符类选择符7在WEB页面中使用CSS的方法有三种_____、_____、_____ 内部样式表内嵌样式外部样式表8 常用的页面布局技术有______、______和______。
DIV+CSS布局框架布局表格布局9 一个标准的网页由_______、_______和_______三部分组成。
结构外观行为10 使用_____语句可以在HTML中引入d:/a.js文件<script type="text/javascript" src="d:/a.js"></script>11 在JavaScript中根据变量的作用域可以分为____和____两种全局变量局部变量12 在浏览器的DOM中,根对象是______ window13 表单对象是________对象的子对象document14 Div层的隐藏和显示主要是用到_________属性,该属性的值为_________时隐藏Div层Display none15调试Servlet时,Eclipse要进入____________视图下Debug16 Servlet中会话跟踪技术的方案有_____、______、______和隐藏表单域技术。
Cookie Session URL重写17 JSP页面中的6个基本元素包括___________、___________、___________、___________、动作标签和注释。
据说JSF的主要负责人就是 struts的主要作者,所以二者的相似点还是有很多的。
都采用taglib来处理表示层:在jsp页面中,二者都是采用一套标记库来处理页面的表示和model层的交互。
二者都采用了bean来作为和jsp页面对应的model层。
该model层保存了jsp 页面上的数据,同时可以作一些验证工作,在struts中就是FormBean,在JSF 中就是back bean。
都采用bean作为控制层,Struts中采用ActionBean来处理业务逻辑,对于简单的应用可以直接在ActionBean中编写业务逻辑代码,也可以调用另外的bean 或者EJB来处理业务逻辑;对于JSF则采用backing bean来处理业务逻辑,同样,backing bean也可以直接编写业务逻辑或者调用其他的bean来处理业务逻辑。
都采用xml配置文件来处理bean的配置,页面导航等问题,增加了系统的灵活性。
都采用资源文件来处理国际化和本地化的问题。
然而,二者的不同点也很多,下面分别说明:首先二者的侧重点不同,Struts侧重于控制层,侧重于如何分派和处理用户的请求,所以表示层的taglib功能不够强大。
而JSF则侧重于表示层,实现了大量的标准组件,允许开发人员对表示层有更多的控制权,同时JSF实现了一个开放的架构,允许开发人员创建自己的组件,或者在现有的组件上继承,开发功能更强大的组件。
本人认为这是JSF最大的一个特色。
(有点类似于vcl和.net 组件)和jsp 对应的model层,在Struts中采用FormBean来保存用户输入的数据,基本上一般字段的类型都是String。
而且可以进行简单的验证,当然如果采用动态的FormBean就不能在FormBean中进行验证了。
在Struts中,jsp和FormBean 是紧密结合在一起的,只要写一个 jsp就必须对应一个FormBean,同时jsp上的每个组件都对应FormBean中相同名字的字段。
•请求转发☐请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。
此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变☐请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应RequestDispatcher rd = request.getRequestDispatcher(path);rd.forward(request,response);或request.getRequestDispatcher(path) .forward(request,response);•重定向☐重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址☐重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求response.sendRedirect(path);•请求转发和重定向区别如下:☐forward()只能将请求转发给同一个Web应用中的组件,而sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。
☐sendRedirect()方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用forward()方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
☐forward()方法的调用者与被调用者之间共享相同的request对象和response对象;而sendRedirect()方法调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。
•使用请求对象(request)存储数据(在servlet中存,在JSP中取)request. setAttribute(“score”,score);int score=(INTEGER)request. getAttribute(“score”);☐HttpServletRequest接口的方法:public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)•使用HttpSession对象存储数据HttpSession session=request.getSession();session. setAttribute(“score”,score);int score=(Integer) session. getAttribute(“score”);☐HttpSession接口的方法public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)•使用ServletContext对象存储数据ServletContext context = this.getServletContext();或ServletContext context = this.getServletConfig().getServletContext();context. setAttribute(“score”,score);int score=(Integer) application. getAttribute(“score”);ServletContext接口的方法public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)简单的说,HttpServletRequest共享的对象仅在请求的生存期中可被访问,使用HttpSession共享的对象仅在会话的生存期中可被访问,使用ServletContext共享的对象在应用程序的生存期中可被访问。
RequestDispatcherRequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。
RequestDispatcher接口中定义了两个方法:include/forward由于<jsp:include>只能指定固定的jsp文件名,不能动态指定jsp文件名。
我们需要把<jsp:include>翻译为Java code –RequestDispatcher.include();用法:<% request.getRequestDispatcher(filename).include(request, response); />服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。
location可以是一个绝对的URL,如response.sendRedirect("")也可以使用相对的URL。
如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。
这种重定向的方法,将导致客户端浏览器的请求URL 跳转。
从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP 响应头信息的实现。
RequestDispatcher.forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。
这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。
比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。
attachbasecontext 调用流程(原创实用版)目录1.attachBaseContext 概述2.attachBaseContext 的调用流程3.attachBaseContext 的应用示例4.attachBaseContext 的优点与局限性正文一、attachBaseContext 概述attachBaseContext 是 Java 中的一个方法,主要用于将一个对象添加到应用程序上下文中。
在 Java Web 开发中,这个方法被广泛应用于将一个对象(通常是一个 JavaBean)添加到 Servlet 的请求或会话属性中,以便在后续的处理过程中使用。
二、attachBaseContext 的调用流程1.首先,创建一个 JavaBean 对象。
这个对象可以是一个普通的 Java 类,只要它遵循 JavaBean 的命名规范(即所有的属性都以"property"为前缀,并且属性的 getter 和 setter 方法都遵循一定的命名规范)。
2.然后,创建一个 Context 对象。
在 Servlet 中,可以通过调用getServletContext() 方法获取到当前 Servlet 的上下文对象。
3.接着,使用 Context 对象的 setAttribute() 方法将 JavaBean 对象添加到上下文中。
这个方法接受两个参数,一个是属性名,一个是要添加的 JavaBean 对象。
4.最后,使用 Context 对象的 getAttribute() 方法从上下文中获取 JavaBean 对象。
这个方法同样接受两个参数,一个是属性名,一个是要获取的 JavaBean 对象。
三、attachBaseContext 的应用示例以下是一个使用 attachBaseContext 方法将用户信息添加到Servlet 请求属性中的示例:```java// 创建一个 UserJavaBean 对象UserJavaBean user = new UserJavaBean();user.setUsername("John");user.setPassword("123456");// 获取 Servlet 的上下文对象ServletContext servletContext = getServletContext();// 将 UserJavaBean 对象添加到 Servlet 请求属性中servletContext.setAttribute("user", user);// 从 Servlet 请求属性中获取 UserJavaBean 对象UserJavaBean retrievedUser = (UserJavaBean)servletContext.getAttribute("user");```四、attachBaseContext 的优点与局限性attachBaseContext 的优点在于它可以将一个对象添加到 Servlet 的请求或会话属性中,使得这个对象可以在整个请求处理过程中被多次访问和使用。
web.xml中的listener、filter、servlet加载顺序及其详解在项⽬中总会遇到⼀些关于加载的优先级问题,刚刚就遇到了⼀个问题,由于项⽬中使⽤了quartz任务调度,quartz在web.xml中是使⽤listener进⾏监听的,使得在tomcat启动的时候能马上检查数据库查看那些任务未被按时执⾏,⽽数据库的配置信息在是在web.xml中使⽤servlet配置的,导致tomcat启动后在执⾏quartz任务时报空指针,原因就是servlet中的数据库连接信息未被加载。
⽹上查询了下web.xml中配置的加载优先级:⾸先可以肯定的是,加载顺序与它们在 web.xml ⽂件中的先后顺序⽆关。
即不会因为 filter 写在 listener 的前⾯⽽会先加载 filter。
最终得出的结论是:listener -> filter -> servlet同时还存在着这样⼀种配置节:context-param,它⽤于向 ServletContext 提供键值对,即应⽤程序上下⽂信息。
我们的 listener, filter 等在初始化时会⽤到这些上下⽂中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet对于某类配置节⽽⾔,与它们出现的顺序是有关的。
以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的⼀个配置节是filter-mapping,这⾥⼀定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节⽽⾔,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。