第一个Struts2.x程序

本文详细介绍Struts2.x框架的搭建与基本使用流程,包括项目创建、配置web.xml、引入Struts2库、编写Action类及配置struts.xml,最后通过示例演示如何处理用户请求并响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 从本质上来讲只要存在MVC设计,那么就一定会存在JSP和Servlet,但是这个时候JSP中可以使用Struts2.x提供的开发标签.同时对于Servlet,也是进行了一个重新定义,使用Action.

开发一个Echo程序.

  • Struts2.x本身就属于一个WeB项目,所以首先要建立一个FirstStruts2Project.

FirstStruts2Project

  • 选择next,选择创建web.xml文件

在这里插入图片描述

  • 几乎所有的前端开发框架.都是需要有web.xml文件的.
  • 创建完成之后项目的基本结构,但此时还缺少Struts2的开发包,以及Struts2.xml文件,如果使用的是myEclipse的话会更加的简单,如果不是则需要手动配置

在这里插入图片描述

  • Struts2.x是一组开发*.jar包,所以理论上需要将开发包保存在WEB-INF/lib中
  • 将下载好的struts2压缩包中的struts-2.3.37\apps目录下找到struts2-blank.war\WEB-INF\lib中的所有jar包
  • 讲这些jar包全都复制到Eclipse创建好的项目中去

在这里插入图片描述

在这里插入图片描述

  • xwork命名的文件都是当年webwork的身影
  • 修改Eclipse中创建项目中的web.xml文件
    • 添加以下内容
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 拷贝完成之后,的web.xml文件

在这里插入图片描述

  • 也可以直接将整个web.xml文件替换Eclipse中的web.xml文件
  • 除了开发包和web.xml文件之外,还需要有struts2.xml文件的支持,拷贝 struts-2.3.37\apps\struts2-blank\WEB-INF\src\java 下的所有文件

在这里插入图片描述

  • 将这些文件复制到Eclipse项目中的src中

在这里插入图片描述

  • 将struts-2.3.37\apps\struts2-blank\WEB-INF\jsp 目录下的example文件夹复制到Eclipse项目中的WebContent中

在这里插入图片描述
example

观察web.xml文件

在这里插入图片描述

  • 可以发现Struts2.x中处理用户请求的是过滤器,之所以使用过滤器原因有:

    1. 过滤器可以像普通Servlet那样处理所有的请求,也可以使用RequestDispatcher实现跳转.
    2. 因为Struts1x使用的是Servlet处理请求,所以Struts2.x为了不同,使用filter(登录检测麻烦).
  • 编写一个Action程序

    • 所有的Action程序都要继承自ActionSupport类.
package mao.shu.action;

import com.opensymphony.xwork2.ActionSupport;

public class EchoAction extends ActionSupport {
	private String msg ;//假设请求传递的参数名称为"msg
	public String getMsg(){
		return this.msg;
	}
	public void setMsg(String msg){//代替了reques.getParameter()方法的操作
		this.msg = msg;
	}
	
	@Override
	public String execute() throws Exception {
		this.msg = "ECHO:"+msg;
		return "echo.page";//返回映射路径名称
	}
}

  • 整个代码中可以发现,没有发现request的身影,直接利用setter方法可以实现参数的传递

  • 如果想要将内容传递回jsp,也不用关心request属性范围

  • 在src/struts.xml文件中配置此Action

    <package name="root" namespace="/" extends="struts-default">
		<action name="Echo"  class="mao.shu.action.EchoAction">
			<result name="echo.page">echo_show.jsp</result>
		</action>
    </package>
  • <package>中的namespace="/"属性与<result>元素中的内容一起组合成完整路径:/echo_show.jsp,所以这个页面一定要保存在根路径之中

  • 定义echo_show.jsp

  • 此时需要使用一些Struts2的显示标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   <%@ taglib prefix="s" uri="/struts-tags" %>
<!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>echo</title>
</head>
<body>
		<h1><s:property value="msg"/></h1>
		<s:form action="Echo.action" method="post">
			<s:textfield key="msg" label="请输入内容"></s:textfield>
			<s:submit value=发送/>
		</s:form>
</body>
</html>

在这里插入图片描述

  • 在MVC标准开发过程之中,一个路径绝对不能够直接去访问一个*.jsp页面,必须通过Action跳转到JSP页面,如果直接访问 echo_show.jsp页面
  • 发送一个中文数据

在这里插入图片描述

  • 这个时候使用标签可以直接于Action中的属性联系在一起(getter方法),对比EchoActioin程序类和struts.xml文件的配置

在这里插入图片描述

Struts2.x原理分析

  • Struts2.x的开发都是基于过滤器完成的,对于过滤器的操作,需要执行两次,请求过滤,回应过滤.
    1 由于现在使用了Struts2.x标签,那么对于程序执行,就必须严格遵守过滤器跳转到JSP页面.实际上也属于WEB的标准流程.
  1. 用户首先要发送一个请求到Struts处理的过滤器上去,输入的路径是"*.action",而这个路径是由web.xml文件负责配置的,

    • 本质是告诉用户哪里可以进行请求的处理,但是在一个项目里面很明显会使用多个Action:
  2. 而后将请求提交到过滤器中后,实际上并不是由过滤器来负责处理的,而是过滤器会根据struts.xml文件中的配置的Action的名字.会根据对应的类型取之于之对应的Action处理类的名称:

  3. 而后会默认调用ActionSupport抽象类中的execute()方法,而且此方法是被子类所复写的.

  4. 当EchoAction中的execute()方法执行完毕之后,返回一个字符串,“echo.page”

    • 在每一个Action里面都可能同时返回多个路径,所以每一个路径都是用了"<result>"元素标注.
  5. 在Servlet定义的服务器端跳转只有一种:RequestDispatcher,这个时候相当于<package>元素中的"namespace"属性结合来定位出每一个跳转的完整路径,而后利用RequestDispatcher接口提供的forward()方法实现跳转:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值