Struts2基础知识整理

本文详细介绍了Struts2的基础知识,包括Struts2框架的核心、配置Filter、web.xml和struts.xml的设置。通过实例展示了如何显示Model层数据、提交数据到Action、处理中文乱码问题以及使用log4j进行日志管理。此外,还提到了Struts2的session获取、通配符匹配和结果跳转方式,为初学者提供了全面的入门指导。

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

Struts2是基于MVC设计模式的WEB框架,这个框架的的核心就是J2EE的过滤器Filter,通过Filter把所有请求转交给Struts2来处理

要使用Struts首先我们先要导入JAR包,同样的,我把完整的Struts分享给大家:

                   链接:https://pan.baidu.com/s/1rQQAlusPkggK4SODJz2tNA 密码:6fi3

再导入JAR包,之后,我们先要配置一个Filter,因为Struts是基于Filter的,我们要把所有请求都过滤给Struts的过滤器

<web-app>
	<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>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>		
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

配置好web.xml之后,我们要在src目录下配置struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <package name="basicstruts" extends="struts-default">

    <action name="index">
      <result>index.jsp</result>
    </action>    

  </package>
</struts>

这是一个最简单的配置,含义就是当我们访问index这个路径时,跳转到index.jsp这个页面

下面,我们可以自己编写一个index.jsp其中的内容随意编写,之后,我们启动tomcat,来访问http://localhost:8080/struts2/index这个路径,如果没有出错的话,我们就可以看到我们编写的struts.jsp了,这是一个最简单的Struts项目,之后,我们再一点点的深入

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

显示Model层的数据

我们先来编写一个JavaBean文件,用来存取数据

package cn.encore.bean;
 
public class Rapper {
 
    int id;
    String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

然后,我们编写一个Action

package cn.encore.action;
 
import cn.encore.bean.*;
 
public class RapperAction {
    private Rapper rapper;
 
    public String show() {
        rapper = new Rapper();
        rapper.setName("王闪火");
        return "show";
    }
 
    public Rapper getRapper() {
        return rapper;
    }
 
    public void setRapper(Rapper rapper) {
        this.rapper = rapper;
    }
}

然后,编写一个show.jsp用于显示数据

    <%@page isELIgnored="false"%>
    ${rapper.name}

因为我们在RapperAction中添加了Getter,Setter方法,程序在访问到我们这个Action时,RapperAction会把rapper对象通过request.setAttribute("rapper", rapper)的rapper这个Key上,这样,在JSP页面中,就方便我们去使用EL表达式来使用这个类了

然后,我们把show.jsp配置到struts.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
  
<struts>
  <package name="basicstruts" extends="struts-default">
  
  <action name="showRapper" class="cn.encore.action.RapperAction" method="show">
    <result name="show">show.jsp</result>
  </action>   
  
</package>
  
</struts>

 然后,我们访问http://localhost:8080/struts2/showRapper这个路径,就可以看到Jsp中取出了我们的王闪火!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

提交数据到action

首先,我们先编写一个addRapper.jsp页面,用于提交数据

<html>
<form action="addRapper">
 <input type="text" name="rapper.name">
    <br/>
 <input type="submit" value="提交">
</form>
</html>

然后,我们把addRapper配置到struts.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
  
<struts>
  <package name="basicstruts" extends="struts-default">
  
  <action name="showRapper" class="cn.encore.action.RapperAction" method="show">
    <result name="show">show.jsp</result>
  </action>   
  <action name="addRapper" class="cn.encore.action.RapperAction" method="add">
    <result name="show">show.jsp</result>
  </action>   
</package>
  
</struts>

然后,我们增加add方法

package cn.encore.action;
 
import cn.encore.bean.*;
 
public class RapperAction {
    private Rapper rapper;
 
    public String show() {
        rapper = new Rapper();
        rapper.setName("王闪火");
        return "show";
    }
    public String add(){
        System.out.println("rapper.name:"+rapper.getName());
        return "show";
    }
    public Rapper getRapper() {
        return rapper;
    }
 
    public void setRapper(Rapper rapper) {
        this.rapper = rapper;
    }
}

然后我们访问http://localhost:8080/struts2/addRapper.jsp这个路径,在我们提交表单时,会转到action中的show方法中,并把我们提交的内容显示出来

访问流程就是,我们先访问我们自己编写的addRapper.jsp这个网页,当我提交表单时,网页会访问addRapper这个路径,而我们配置的Filter会做拦截,并把这项任务交给struts来处理,struts会在struts.xml中读取如何处理这个请求,我们配置的是交给add方法处理,在add方法执行之前Struts会生成一个Rapper对象,并把传递过来的值赋给这个对象,接着通过SetRapper方法把这个对象注入RapperAction中,然后转交给show方法,来处理这个请求

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

正常显示中文

可能之前的操作,有的小伙伴在输入英文时,程序准确无误,可是在输入中文时,程序会造成乱码现象,解决这个问题的原理就是保证输入端和输出端保证相同的编码集

首先,我们要确保JSP提交的中文编码,在JSP页面首行加上:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

然后,我们要Struts中使用UTF-8来解码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
  
<struts>
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  <package name="basicstruts" extends="struts-default">
  
  <action name="showRapper" class="cn.encore.action.RapperAction" method="show">
    <result name="show">show.jsp</result>
  </action>   
  <action name="addRapper" class="cn.encore.action.RapperAction" method="add">
    <result name="show">show.jsp</result>
  </action>   
</package>
  
</struts>

看到,多了一行:<constant name="struts.i18n.encoding" value="UTF-8"></constant>,这是声明Struts的解码集

这样,我们就可以正常的显示中文了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

log4g

在struts中,是默认关闭日志的,这对于我们来说,想要定位错误是十分困难并且头痛的,在这里,我们需要借助log4j这个JAR包,之前我分享的资源已经把log4j捆绑到里面了,使用我的资源可以直接使用,没有的话可以百度下载一个log4j的JAR包

然后,我们只需要在src目录下配置一个log4j.xml文件,就可以使用了

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
     
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
       <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/>
       </layout>
    </appender>
  
    <!-- specify the logging level for loggers from other libraries -->
    <logger name="com.opensymphony">
        <level value="DEBUG" />
    </logger>
 
    <logger name="org.apache.struts2">
         <level value="DEBUG" />
    </logger>
   
   <!-- for all other loggers log only debug and above log messages -->
     <root>
        <priority value="INFO"/>
        <appender-ref ref="STDOUT" />
     </root>
     
</log4j:configuration>

使用log4j会使我们的服务器启动变慢,想要关闭log4j最简单的办法就是,把log4j.xml随便改一个其他的名字,等想用时再改回来就可以了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果想要获取原生的request,response也是可以做到的,相应方法如下

     import org.apache.struts2.ServletActionContext;

     HttpServletRequest request = ServletActionContext.getRequest();

     HttpServletResponse response = ServletActionContext.getResponse();

是借助ServletActionContext这个类得到的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Struts中的session有两个,一个是传统原生的session,还有一个Struts自己定义的,要获取到Struts定义的session方法如下

import com.opensymphony.xwork2.ActionContext;

      Map m = ActionContext.getContext().getSession();

可以到看到,我们获得到一个Map类型的类,我们只需要往这个Map中Put进值,在jsp页面中就可以通过EL表达式,通过Key来获取值了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~调试

有个工具struts2-config-browser-plugin-2.2.3.1.jar,去网上下载这个包,然后访问http://localhost:8080/struts2/config-browser/actionNames这个路径,可以在网页中查看我们配置了哪些action,注意8080后跟的struts是我的项目名,如果不同情切换到你自己的项目名就可以运行成功

还有一个比较牛逼的调试工具是struts自带的,这里涉及到了struts的标签库相关的知识,我会在后续整理,就是struts的debug标签,他可以查看你通过action传过来的值有没有准确到达

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~通配符匹配

学到目前为止,我们配置show,add的ACTION,一个真正的应用程序不可能就这点方法,如果配置大量的设置会很麻烦,这里Struts为我们提供了通配符匹配的方式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>
   
  <package name="basicstruts" extends="struts-default">
  
  <action name="*Rapper" class="cn.encore.action.RapperAction" method="{1}">
    <result name="show">show.jsp</result>
    <result name="add">add.jsp</result>
  </action>   
 
</package>
 
</struts>

这里会把所有后缀是Rapper的路径匹配到这个配置来执行,method="{1}"表示要替换的是*Rapper里的*,当访问showRapper十转到show方法,当访问addRapper十转到add方法

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

struts默认使用的都是服务器跳转304,如果想要使用客户端跳转302,只需要在result标签中添加type="redirect"这个属性就可以了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在默认设置下,Action是多实例的,每次访问都会创建新的Action实例

以上就是Struts的基础知识,消化完这些,可以继续深入理解Struts的原理,以及Struts提供的注解配置,标签等等各种特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值