(五)Struts之Action类基础(二)

  • 上一章节末((三)Struts之Action类基础(一))介绍了如何获取用户输入数据的获取。接着就是在Struts中怎么把数据响应给用户端,这就必须要求我们把数据放到作用域中,然后才能显示到用户浏览器。

一、将数据放到作用域并在用户浏览器中显示

  A、 使用Servlet原生作用域(request、session、servletContext)

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%
String path=request.getContextPath();
%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <pre>
        <h3>把数据放到Servlet原生作用域(request、session、servletContext)然后显示</h3>

        <a href="<%=path%>/scope/scope_1">点我显示数据</a>

    </pre>
</body>
</html>

界面:

struts.xml

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/scope" extends="struts-default">
        <action name="scope_1" class="scope.ActionScope_1">
        <result name="show">/show.jsp</result>
        </action>
    </package>

</struts>

ActionScope.java

package scope;

import action.BaseAction;

public class ActionScope_1  extends BaseAction{

    @Override
    public String execute() {

        request.setAttribute("request_key", "request作用域的值");
        session.setAttribute("session_key", "session作用域的值");
        servletContext.setAttribute("servletContext_key", "servletContext作用域的值");
        return "show";
    }
}

show.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <pre>
                <h3>显示放在作用域中的数据</h3>
        request作用域的值为:${requestScope.request_key }
        session作用域的值为:${sessionScope.session_key }
        servletContext作用域的值为:${applicationScope.servletContext_key }
    </pre>
</body>
</html>

结果:

  B、使用struts封装的作用域

  • 使用struts封装的作用域,把reuqest、session、servletContext作用域封装成Map

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%
String path=request.getContextPath();
%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <pre>
        <h3>把数据放到Struts封装的作用域中然后显示</h3>

        <a href="<%=path%>/scope/scope_2">点我显示数据</a>

    </pre>
</body>
</html>

界面:

  • struts.xml
<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/scope" extends="struts-default">
        <action name="scope_2" class="scope.ActionScope_2">
        <result name="show">/show.jsp</result>
        </action>
    </package>

</struts>
  • ActionScope_2.java
package scope;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

import action.BaseAction;

public class ActionScope_2  extends BaseAction{
/**
 * 用Struts封装的作用域ActionContext(Action上下文)存放数据
 * ActionContext和ServletActionContext的区别,ServletActionContext用于
 * 获取servlet原生对象
 * ActionContext把servlet作用域封装成Map
 */

    @Override
    public String execute() {
        ActionContext actionContext=ActionContext.getContext();
        //request作用域的获取比较特殊
        //获取action封装后的作用域
        Map<String,Object> requestMap=(Map<String,Object>)actionContext.get("request");
        Map<String,Object> sessionMap=actionContext.getSession();
        Map<String,Object> applicationMap=actionContext.getApplication();

        //在作用域中存放数据
        requestMap.put("requestMap_key", "requset中的值1");
        sessionMap.put("sessionMap_key", "sessionMap中的值1");
        applicationMap.put("applicationMap_key", "applicationMap中的值1");
        return "show";
    }

}
  • show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <pre>
                <h3>显示放在作用域中的数据</h3>
        request作用域的值为:${requestScope.requestMap_key }
        session作用域的值为:${sessionScope.sessionMap_key }
        servletContext作用域的值为:${applicationScope.applicationMap_key }
    </pre>
</body>
</html>

结果:

  • 解析: Struts中通过ActionContext这个静态类可以得到request、session、servletContext作用域,并把这些作用于封装成Map对象,而在JSP页面中,通过EL表达式获取作用域中的值的方式没有改变,${requestScope.value1 }或${sessionScope.value2}或${applicationScope.value3}


  • 上述例子中显示数据的方式是EL表达式,在Struts中可以用Struts的方式来显示数据。

二、数据在页面上的显示

  A、 使用EL表达式+JSTL标签

以上述例子所示,index.jsp和struts.xml和ActionScope_2.java文件均与上例一样,show.jsp如下:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11     <pre>
12                 <h3>El表达式+JSTL标签显示放在作用域中的数据</h3>
13         <c:if test="${requestScope.requestMap_key==null}">
14             <c:out value="${requestScope.requestMap_key}"></c:out>
15         </c:if>
16
17         session作用域的值为:${sessionScope.sessionMap_key }
18         servletContext作用域的值为:${applicationScope.applicationMap_key }
19     </pre>
20 </body>
21 </html>
  • 注意第13行中的语句${requestScope.requestMap_key==null} 如果requestScope中的requestMap_key值等于null的话就显示出来,否则不显示,结果如下,并不显示reqeuset作用域中的数据,说明JSTL+EL表达式成功运行:

  B、使用OGNL表达式+Struts标签

  • Struts标签中不能用EL表达式,如<s:if test="${sessionScope.sessionMap_key}" 这是错的<s:if>是struts标签,而${sessionScope.sessionMap_key是el表达式。同理,JTSL标签中不能用OGNL表达式。
  • 以上述例子所示,index.jsp和struts.xml和ActionScope_2.java文件均与上例一样,show.jsp如下:
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 4  <%@ taglib prefix="s" uri="/struts-tags" %>
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 6 <html>
 7 <head>
 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 9 <title>Insert title here</title>
10 </head>
11 <body>
12     <pre>
13                 <h3>El表达式+JSTL标签显示放在作用域中的数据</h3>
14         <c:if test="${requestScope.requestMap_key==null}">
15             <c:out value="${requestScope.requestMap_key}"></c:out>
16         </c:if>
17
18         <h3>OGNL表达式+Struts标签显示放在作用域中的数据</h3>
19
20     <s:if test="#request.requestMap_key!=null">
21         <s:property value="#request.requestMap_key"/>
22     </s:if>
23     </pre>
24 </body>
25 </html>
  • 注意EL表达式和OGNL表达式取值的方法,EL表达式取出reqeuse、session、application作用域中值的方法为requestScope.属性名【sessionScope.属性名】【applicationScope.属性名】  而OGNL表达式取出作用域中的值的方法为#request.属性名【#session.属性名】【#application.属性名】


三、Struts和servlet同时使用

  • 当我们部署好Struts之后,web.xml中的

<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  • 会拦截一切页面,其中如果定义了一个servlet,也会把当作action处理。比如当URL=“工程名/servlet/TestServlet”
  • web.xml
 <servlet>
    <description></description>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/servlet/test</url-pattern>
  </servlet-mapping>

我们希望会执行servlet.TestServlet这个servlet类,但是实际上被struts拦截器当成action了,就去struts.xml中找命名空间为/servlet的action名为TestServlet,但是找不到于是就是报错。

  • 解决上述问题的方法

要解决这个问题就不得不提起struts.xml中的一个常量<constant name="struts.action.extension" value="=action,,"/> 默认也是这个,意思是对于所有的请求后缀名为action或者为空的请求,都会被拦截,并到struts.xml中寻找相对应的Action.

    •    解决方法1 :将servlet的后缀名更改为与Struts中常量(struts.action.extension)不一样的后缀名
    • 解决方法2:将struts的后缀名改掉。比如:

      <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>*.action</url-pattern>
        </filter-mapping>
    • 解决方法3: 如果都不改后缀名,
  • 示例:
  • index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%
String path=request.getContextPath();
%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <pre>
      <a href="<%=path%>/servlet/test.do">点击跳转到servlet页面</a>
    </pre>
</body>
</html>
  • struts.xml
<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.action.extension" value="=action,,"/>
    <package name="default" namespace="/scope" extends="struts-default">
        <action name="scope_2" class="scope.ActionScope_2">
        <result name="show">/show.jsp</result>
        </action>
    </package>

</struts>
  • web.xml
  <servlet>
    <description></description>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/servlet/test.do</url-pattern>
  </servlet-mapping>
  • TestServlet.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out=response.getWriter();

        out.print("我是servlet");
    }

结果:

时间: 2024-09-30 14:26:47

(五)Struts之Action类基础(二)的相关文章

Struts的Action类

Struts2 是一个用来开发 MVC 应用程序的框架. 它提供了 Web 应用程序开发过程中的一些常见问题的解决方案包括: 对来自用户的输入数据进行合法性验证. 统一的布局. 可扩展性.国际化和本地化.支持 Ajax.表单的重复提交.文件的上传下载等等. 1. action VS Action 类 1). action: 代表的是一个 Struts2 的请求. 2). Action 类: 一个能够处理 Struts2 请求的java类. > 属性的名字必须遵守与 JavaBeans 属性名相同

第五课 Struts的控制器【续】Action类的execute()方法

1.Action类的execute()方法: public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException : 2.Action类的execute()方法的参数和返回值: – execute()方法包含以下参数: –ActionMap

Bootstrap &lt;基础二十五&gt;警告(Alerts)

警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个可选的关闭按钮.为了创建一个内联的可取消的警告框,请使用 警告(Alerts) jQuery 插件. 您可以通过创建一个 <div>,并向其添加一个 .alert class 和四个上下文 class(即 .alert-success..alert-info..alert-warning..ale

SSH整合(二)——利用Spring来装配Action类

在上篇文章(SSH整合(一)--直接获取ApplicationContext)中,在Action类中通过获取ApplicationContext对象,调用getBean方法来实例化bean类,这种方法将Action类与Spring的绑定装配JavaBean绑定的过紧,大大增加了他们的耦合度.如果装配文件的内容有变化,很可能要修改Action类的代码. 所以我们将装配Action类及其属性的方法也放到Spring中. 一,由Spring创建Action对象 例如,action代码如下: packa

struts笔记02-action和Action类

1.action      action表示一个struts2的请求! 2.Action类 能够处理struts2请求的类. (1)属性的名字需要与JavaBeans属性保持一致. 属性的类型可以是任意类型.从字符串到非字符串(基本数据类型)之间的数据转换可以自动发生. (2)必须有一个不带参的构造器 (3)至少提供一个供struts在执行这个action时调用的方法 (4)同一个Action类可以包含多个action方法. (5)struts2会为每一个HTTP请求创建一个新的Action实例

Struts2系列笔记(3)---Action类的3种书写方式

Action类的3种书写方式 本文主要写有关写Action类的3种书写方式: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 (2)实现Action接口 (3)继承ActionSupport(推荐) 那我们先来书写第一种: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 1 //这里其实就是一个普通的类,类里面的方法可以任意写,如果写execute()方法那就代表默认执行它 2 pub

Struts中Action&ActionForm

在Struts架构中,通常使用一种名为ActionForm的系统状态Bean,来实现应用系统的非持久性数据存储和维护功能.具体来说,这种类型的对象主要用于保存用户请求表单中的数据,并可保持其状态的连续性,即在不同的页面间传递这些数据. ActionForm Bean的运行处理过程如下: 控制器ActionServlet接收到一个客户端请求后,会将该请求委托给一个RequestProcessor对象进行处理.该对象是遵照配置文件struts-config.xml中与该请求匹配的<action>子

JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表

一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public class HelloAction { public String hello(){ System.out.println("hello world!"); return "success"; } } 3.书写src/struts.xml (记得加上dtd约束) &l

Action类一般情况为何要继承ActionSupport

struts2中的action可以继承ActionSupport,也可以不继承ActionSupport.不继承ActionSupport的情况只需要有一个方法,返回String,即可,记住,在继承ActionSupport的情况下,必须有无参构造函数.继承ActionSupport的好处在于:1.能够使用struts预设的返回字符串,如SUCCESS,INPUT等等.2.重写方法,更方便的实现验证.国际化等等功能.3.与struts的功能结合紧密,方便开发. Action接口有: public