Java轻量级MVC框架Struts2 2.5详解(4)Struts2的拦截器

Java常用框架的优缺点和区别 Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。 Struts2优点 1、实现了MVC模式,层次结构清晰。 2、拥有丰富的标签库,大大的提高了开发的效率。 3、使用了OGNL:OGNL可以快速的访问值栈中的数据、调用值栈中对象的方法。 4、提供了丰富的拦截器。 5、Struts2为多种视图选项(J... 阅读详情

一、拦截器概述

拦截器:Struts2拦截器是在访问某个Action或Action的某个方法之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。

AOP:面向切面编程.其实现原理:动态代理模式

WebWork中文文档解释:拦截器是动态拦截Action调用的对象。

它提供了一种机制使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的代码的方式。

拦截器栈(Interceptor Stack):Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

      拦截器能把很多功能从Action中独立出来,分散到不同的拦截器里面,减少了Action的代码。如此,拦截器和Action本身的功能都更单一了。当通用的功能代码被封装在拦截器里面(代码模块化),就可以对不同的Action,根据功能需要,来配置相应功能的拦截器了。提高了拦截器所实现的功能的重用性,也变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。

二、Struts2 拦截器的实现

1).实现interceptor接口

Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。

该接口声明了3个方法,其中,init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。

intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。

public interface Interceptor extends Serializable {

    /**
     * Called to let an interceptor clean up any resources it has allocated.
     */
    void destroy();

    /**
     * Called after an interceptor is created, but before any requests are processed using
     * {@link #intercept(com.opensymphony.xwork2.ActionInvocation) intercept} , giving
     * the Interceptor a chance to initialize any needed resources.
     */
    void init();

    /**
     * Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the
     * request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code.
     *
     * @param invocation the action invocation
     * @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself.
     * @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}.
     */
    String intercept(ActionInvocation invocation) throws Exception;

}

所有拦截器都使用接口Interceptor ,Action去实现这个接口;

Init()方法:在服务器起动的时候加载一次,并且只加载一次;

Destroy()方法:当拦截器销毁时执行的方法;

Interceptor()方法:其中里边有一个参数invocation;


2).继承 AbstractInterceptor类

public abstract class AbstractInterceptor implements Interceptor {

    /**
     * Does nothing
     */
    public void init() {
    }
    
    /**
     * Does nothing
     */
    public void destroy() {
    }


    /**
     * Override to handle interception
     */
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}

 继承AbstractInterceptor类,只需覆盖Interceptor()方法就可以。

三、Struts2拦截器与Servlet的过滤器的区别

1).过滤器:

      在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

2).拦截器:

      在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

拦截器与过滤器的区别 :

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

6、执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。

过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

一个Filter 可负责拦截多个请求或响应:一个请求或响应也可被多个请求拦截。

创建一个Filter 只需两个步骤:

(1)创建Filter 处理类:

(2)在web.xml 文件中配置Filter 。

创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。

• void init(FilterConfig config): 用于完成Filter 的初始化。

• void destroy(): 用于Filter 销毁前,完成某些资源的回收。

• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。 

过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>该元素位于filter-mapping中。
 

四、Struts2内置拦截器

Struts2内置了很多拦截器,Struts2框架中自定义的,可以直接拿来使用的拦截器。不同的拦截器栈(interceptor-stack)是不同拦截器的组合,用户根据不同的需求选择不同的拦截器栈.

内置拦截器在哪里,找到:struts2-core-2.5.18.jar包中的struts-default.xml文件.

常见的拦截器:

1:params拦截器

   这个拦截器偷偷的把请求参数设置到相应的Action的属性去的,并自动进行类型转换。              

2.modelDriven拦截器

   如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。

3.execption拦截器

   顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。

4.validation拦截器

   调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。

5.token拦截器

   核对当前Action请求(request)的有效标识,防止重复提交Action请求。

6.fileUpload拦截器

    用来处理文件上传

7.workflow拦截器

     调用Action的validate方法,一旦有错误返回,重新定位到INPUT结果视图

8.servletConfig

    通过感知接口,获取感应对象

 

五、Struts2自定义拦截器

自定义登录验证拦截器

0.相关的Ation和jsp文件

 1)LoginAction.java文件

package org.openbox.Interceptor;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{	
	private static final long serialVersionUID = 1L;	
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String execute() throws Exception {
		//登录验证
		if ("admin".equals(username) && "ps_2008".equals(password)) {
			//登录成功,将数据放到session中
			ActionContext.getContext().getSession().put("USER_IN_SESSION",username);
			return Action.SUCCESS;
		}
		//失败返回登录并提示
		ActionContext.getContext().put("errorMsg", "请求失败");
		return "failure";
	}
}

 2)login.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<span style="color:red">${errorMsg}</span>
<form action="/login" method="post">
    账号:<input name="username" /><br>
    密码:<input name="password" /><br>
    <input type="submit" value="login">
</form>
</body>
</html>

3)welcome.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录成功</title>
</head>
<body>
${USER_IN_SESSION}登录成功
</body>
</html>

1.定义一个拦截器

   方式1:实现com.opensymphony.xwork2.interceptor.Interceptor接口.

   方式2:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类.

   拦截器类文件:LoginInterceptor.java 

package org.openbox.Interceptor;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

//拦截器
public class LoginInterceptor extends AbstractInterceptor{
	private static final long serialVersionUID = 1L;

	private String resultPage;
	//从拦截器配置文件中,获取返回结果页面,这样代码中没有硬编码
	public void setResultPage(String resultPage) {
		this.resultPage = resultPage;
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {

		//从session中取出登录数据,通过ActionInvocation对象
		ActionContext ctx = invocation.getInvocationContext();
		//SESSION存在MAP中
		Map<String, Object> session = ctx.getSession();
		Object object = session.get("USER_IN_SESSION");
		
		//失败,没有取到SESSION值,重返登录页面
		if (object==null) {
			//从拦截器参数中,获得结果视图页面
			return resultPage;
		}
		
		//成功就放行操作
		return invocation.invoke();
	}
}

2.注册自定义拦截器

      第一步:先在<package>下声明拦截器LoginInterceptor.

      第二步:在相应的<action>中来引用LoginInterceptor拦截器,在那拦截就在那引用

      1)struts.xml配置文件 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<!-- 1.struts2默认常量修改,不能直接修改default.propertis中的常量 -->
	<constant name="struts.action.extension" value="action,do,neld,"></constant>
	<constant name="struts.serve.static.browserCache" value="false"></constant>
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

	<!-- 2.主struts.xml文件,引用所有包中的struts-xxx.xml文件 -->	
	<include file="org/openbox/Interceptor/struts-interceptor.xml"></include> 
</struts>

      2)struts-interceptor.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="loginpkg" namespace="/" extends="struts-default">
		<!-- 注册拦截器 -->
		<interceptors>
			<interceptor name="checklogin"
				class="org.openbox.Interceptor.LoginInterceptor"></interceptor>
		</interceptors>

		<!-- 全局结果视图 -->
		<global-results>
			<result name="failure" type="dispatcher">/login.jsp</result>
		</global-results>

		<!-- 配置ACTION -->
		<action name="login"
			class="org.openbox.Interceptor.LoginAction" method="execute">
			<result name="success" type="redirectAction">main</result>			
			<allowed-methods>execute</allowed-methods>
		</action>

		<!-- 定义一个默认的action,不用真正的写这个action -->
		<action name="main">
			<!-- 引用拦截器 -->
			<interceptor-ref name="checklogin" />			
			<result>/welcome.jsp</result>
		</action>
	</package>
</struts>

3.配置拦截器栈和拦截器参数

 1)修改后的struts-interceptor.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="loginpkg" namespace="/" extends="struts-default">

		<!-- 注册拦截器 -->
		<interceptors>
		<interceptor name="checklogin" class="org.openbox.Interceptor.LoginInterceptor">
			    <!-- 为拦截器配置参数:指定返回结果页面 -->
				<param name="resultPage">failure</param>
			</interceptor>

			<!-- 拦截器栈:引用自定义和系统默认拦截器 -->
			<interceptor-stack name="mystack">
				<interceptor-ref name="checklogin" />
				<interceptor-ref name="defaultStack" />			 
			</interceptor-stack>
		</interceptors>

		<!-- 默认拦截器引用:自定义的拦截器栈  -->
		<default-interceptor-ref name="mystack" />
		
		<!-- 全局结果视图 -->
		<global-results>
			<result name="failure" type="dispatcher">/login.jsp</result>
		</global-results>

		<!-- 配置ACTION -->
	<action name="login" class="org.openbox.Interceptor.LoginAction" method="execute">
		    <!-- 第一个Action不需要自定义拦截器,所以只引用默认拦截器栈 -->
		    <interceptor-ref name="defaultStack" />
			<result name="success" type="redirectAction">main</result>
			<allowed-methods>execute</allowed-methods>
		</action>

		<!-- 定义一个默认的action,不用真正的写这个action -->
		<action name="main">		
			<result>/welcome.jsp</result>
		</action>
	</package>
</struts>

2)修改后的拦截器类文件LoginInterceptor.java 

package org.openbox.Interceptor;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

//拦截器
public class LoginInterceptor extends AbstractInterceptor{

	private String resultPage;
	//从拦截器配置文件中,获取返回结果页面,这样代码中没有硬编码
	public void setResultPage(String resultPage) {
		this.resultPage = resultPage;
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {

		//从session中取出登录数据,通过ActionInvocation对象
		ActionContext ctx = invocation.getInvocationContext();
		//SESSION存在MAP中
		Map<String, Object> session = ctx.getSession();
		Object object = session.get("USER_IN_SESSION");
		
		//拦截判断:没有取到SESSION值,重返登录页面。
		if (object==null) {
			//从拦截器参数中,获得结果视图页面
			return resultPage;
		}
		
		//成功就放行操作
		return invocation.invoke();
	}
}

4.利用拦截器参数排除不需要拦截的Action

其它文件和上面的相同,只需要改动struts-interceptor.xml和LoginInterceptor.java文件

重点在这里:

1)不用拦截的Action名称

2)两个Action中都不用再指定拦截器

3)给所有Action指定默认拦截器

4)拦截器文件中增加获取参数的代码

5)在拦截操用中,判断是否放行

 

6)测试结果

 

7)这两部分完整代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="loginpkg" namespace="/" extends="struts-default">
		<!-- 注册拦截器 -->
		<interceptors>
		<interceptor name="checklogin" class="org.openbox.Interceptor.LoginInterceptor">
			<!-- 为拦截器配置参数:指定返回结果页面 -->
				<param name="resultPage">failure</param>
				<param name="unCheckAction">login,logon,abc,xxx</param>
			</interceptor>

			<!-- 拦截器栈:引用自定义和系统默认拦截器 -->
		    <interceptor-stack name="mystack">
				<interceptor-ref name="checklogin" />
				<interceptor-ref name="defaultStack" />			 
			</interceptor-stack>
		</interceptors>

		<!-- 默认拦截器引用:自定义的拦截器栈  -->
		<default-interceptor-ref name="mystack" />
		
		<!-- 全局结果视图 -->
		<global-results>
			<result name="failure" type="dispatcher">/login.jsp</result>
		</global-results>

		<!-- 配置ACTION -->
	<action name="login" class="org.openbox.Interceptor.LoginAction" method="execute">		   
			<result name="success" type="redirectAction">main</result>
			<allowed-methods>execute</allowed-methods>
		</action>

		<!-- 定义一个默认的action,不用真正的写这个action -->
		<action name="main">		
			<result>/welcome.jsp</result>
		</action>
	</package>
</struts>
package org.openbox.Interceptor;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

//拦截器
public class LoginInterceptor extends AbstractInterceptor{
	private String resultPage;
	//从拦截器配置文件中,获取返回结果页面,这样代码中没有硬编码
	public void setResultPage(String resultPage) {
		this.resultPage = resultPage;
	}

	private List<String> unCheckAction = null;	
    //从拦截器配置文件中,将不要拦截器的Action的名称,放入列表中
	public void setUnCheckAction(String actionName) {
		if (actionName!=null) {
			this.unCheckAction=Arrays.asList(actionName.split(","));
		}
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//1.获取当前请求的Action名称
		String actionName=invocation.getProxy().getActionName();	
		System.out.println(actionName);
		System.out.println(unCheckAction);
		
		//2.从session中取出登录数据,通过ActionInvocation对象
		ActionContext ctx = invocation.getInvocationContext();
		//SESSION存在MAP中
		Map<String, Object> session = ctx.getSession();
		Object object = session.get("USER_IN_SESSION");
		
		//3.拦截判断:没有取到SESSION值,重返登录页面。当前的action名称,不在非拦截列表中
		if (object==null && !unCheckAction.contains(actionName)) {
			//从拦截器参数中,获得结果视图页面
			return resultPage;
		}	
		//成功就放行操作
		return invocation.invoke();
	}
}

 

Struts2.0开发手册:Java Web开发的MVC框架 本文还有配套的精品资源,点击获取 简介:Struts2.0是基于Struts1.x改进的Java Web MVC框架,本手册深入探讨其核心概念、配置及实践方法。内容包括Action和结果类型处理、拦截器的灵活性、OGNL表达式的使用、XML和注解配置选项、丰富的插件生态、全局异常处理、国际化支持以及单元测试友好的特点。开发人员通过阅读,可深入了解Struts2.0的高级特性... 阅读详情

相关推荐

Struts2框架深入解析与实践

Struts2是一个用于开发Java EE Web应用程序的开源MVC框架。它的核心理念是分离业务逻辑、数据模型和表示层,从而简化Web层的开发。Struts2通过提供丰富的标签库、拦截器、插件支持等机制,使开发者可以高效地构建基于Web的应用程序。此外,Struts2支持多种视图技术,如JSP、FreeMarker和Velocity,为视图层提供了灵活的选择。通过这种方式,Struts2帮助开发者集中精力实现业务逻辑,而将页面渲染和请求处理交给框架处理。

weixin_28746213的博客 1156

解决Struts2版本2.5之后Action动态方法调用不能正常访问

struts2从2.5版本开始,为了提升安全性,默认开启了严格的方法调用。那么如何解决action动态调用不能正常访问呢?1、首先,开启动态调用;       &lt;constant name="struts.enable.DynamicMethodInvocation" value="true"&gt;&lt;/constant&gt;2、必须在package中设置 strict-method...

金戈鐡馬 3134

Struts2+Hibernate+Spring框架整合开发实践

本文还有配套的精品资源,点击获取 简介:Struts2、Hibernate和Spring是Java开发中广泛使用的三大轻量级框架。Struts2负责前端交互和业务逻辑分离,Hibernate简化数据库操作,Spring提供全面的后端服务。整合这些框架能够构建出高效、松耦合的企业级应用,降低开发难度,提高效率。本实践项目涵盖了MVC模式、对象关系映射、依赖注入、面向切面编程等...

weixin_42576186的博客 2110

Struts2.5版本之后Tomcat启动报错问题

初次学习Struts2,本着学习最新版本知识的原则,使用了Struts2.5.5版本。使用2.1版本没有问题,但是2.5版本果然会报错,完全靠自学。。。我真是解决两个小时啊!对新手来说上手坑真的比较多。。。 1.导入lib,我们只需要导入一些最小依赖包,下面列出的是我导入的 commons-fileupload-1.3.2.jar commons-io-2.4.jar commons-la...

Daniel的博客 1万+

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1791

掌控板玩板指南1:初识掌控板、扩展板、Mind+编辑器

掌控板、I/O扩展板入门

好乐无荒之地 1万+

Struts2最新版(2.5.12)快速入门(四) struts2之拦截器(Interceptor)

一、初识拦截器           1、拦截器原理                    "拦截器"顾名即可思义,它是对action的请求做出拦截,然后处理访问到action之前相应的业务逻辑。其原理还是比较简单的,当请求到我们的action的时候,struts2会去查找配置文件,                    或者配置的annotation根据找到的拦截器配置去实例相对应的拦

无名氏灬的博客 1732

要配置西门子G120XA变频器实现**端子启停**和**Modbus RTU(485)频率给定

如有问题,可通过STARTER软件在线诊断Modbus通讯状态。要配置西门子G120AX变频器实现。

微:13763355074 4842

Struts2之Struts2-2.5.5 Interceptor

Struts2-2.5.5版本是目前为止最新的版本了,相对于之前的2.3版本以及再之前的版本而言,新版本改动了很多。 好了,废话不多说,GO CODE! 基本jar包: web.xml核心配置,这里要注意咯! <!-- struts2核心控制器 --> <filter> <filter-name>s...

weixin_30480651的博客 190

【机器学习—评估指标】混淆矩阵、准确率、精确率、召回率、F1分数、ROC曲线和AUC

机器学习评价指标是衡量模型性能的关键工具。本文介绍了常见指标及其计算方法:1.混淆矩阵展示分类预测结果分布,包含TP、TN、FP、FN四个基础指标;2.准确率反映整体预测正确率;3.精确率关注预测正例的准确性;4.召回率衡量正例检出能力;5.F1分数综合平衡精确率和召回率;6.ROC曲线通过TPR与FPR的权衡关系评估模型性能,AUC值量化区分能力。文章详细说明了各指标的定义、计算公式、适用场景及局限性,并通过Python代码示例演示了具体实现方法,特别对ROC曲线和AUC的计算原理进行了深入解析。

weixin_51375278的博客 6743

WinCC ActiveX控件“许可证缺失”故障排查:从注册表修复到系统兼容性全解析

本文深入解析WinCC ActiveX控件报错“未找到许可证信息”的根本原因与解决方案。核心在于系统注册表中控件的设计时许可证密钥丢失或损坏。文章提供了从手动修复注册表、排查64位系统兼容性,到预防性环境部署的全流程专业指南,帮助工程师彻底解决这一常见故障。

oil88的博客 646

Messages:This method: edit for action XXX is not allowed!-Struts2.5动态方法调用错误解决方法

struts.xml部分配置Action部分代码报错信息解决方案此处查阅了大量文章,还有struts官方文档: struts2:This method: login for action user is not allowed! 在struts2.5版本中使用DMI遇到问题 Struts 2.5 动态方法调用(DMI)问题 Apache Struts 2 Documentation Action C

卡布奇客说 2651

Anthropic发布10款金融AI智能体模板深度解析:重构华尔街工作范式

摘要:2026年5月,Anthropic发布10款金融AI智能体模板,标志着AI从辅助工具升级为"虚拟同事"。这些智能体深度集成到Word、Excel等办公软件中,覆盖投行、商行、资管三大场景的核心工作流,预计可提升效率35-85%。技术架构基于Claude3.5Sonnet模型,具备200K上下文窗口和95%+的财务图表解析准确率,并与彭博等金融数据源直连。发布引发传统金融数据服务商股价下跌,摩根大通等机构则视其为成本优化工具。落地需分四阶段推进,关键在于数据治理和复合型人才培养。未来

yyq916的博客 633

JAVA框架——struts(一)struts快速入门,struts访问流程,struts配置文件详解,动态方法调用

一、 Struts2框架概述 是一种基于MVC模式的轻量级web框架。本质是一个Servlet。作为控制器建立模型与视图的数据交互。Struts2以WebWord为核心,采用拦截器的机制处理客户的请求。使得业务逻辑控制能够与Servlet分隔开,减少耦合度。 二、 Struts2框架优势 项目开源,使用及拓展方便 提供Exception处理机制 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 防止表单重复提交 三、 常见的WEB层的框架 Struct2 Struct1 Web

Mr_GYF的博客 6948

TortoiseGit提示No supported authentication methods available错误

一、问题 在使用TortoiseGit与远程仓库进行同步代码的时候提示如下错误,即:没有支持认证的方法可用。而GitBash却可以正常使用,不受影响。 通过调查,发现应该是TortoiseGit远程仓库的公匙无法和本地的密匙进行匹配认证造成的(主要是TortoiseGit缺少本地密匙)。由于TortoiseGit的默认网络SSH client是TortoiseGitPlink.exe,如下图所示。因此主要有两种方式来解决该问题: 不修改TortoiseGit的默认网络SSH client,此时需要为To

Jeffxu_lib的博客 2万+

BOSS直聘数据采集、解析处理、分析与可视化实战

招聘和求职是一对永恒的话题,不论什么时候都有招聘或者是求职的需求,找不找得到工作可能最主要的就是匹配度是否高,待遇福利是否诱人,如今互联网的快速发展,找工作的方式早已发生了翻天覆地的变化,从以往的面对面形式的招聘简历投递和面试方式,变成了电子简历网络直接投递、远程面试录用的形式,便捷性大大提升,需求的快速增长,促生了一批互联网招聘类的企业,诸如:51job、BOSS直聘、拉勾网等等,为了能...

Together_CZ的博客 9021

java中struts2框架,概述Java的struts2框架

一.Struts2简介 1.Struts2概述 Struts2是Apache发行的MVC开源框架.注意:它只是表现层(MVC)框架. M:model-----数据封装------->javabean V:view------视图----------->jsp C:control------控制器--------> struts2( filter),struts1(servlet) 2.Struts2的来历 Struts1:也是apache开发的一套mvc的开源框架.在2005年之前非。

2401_85113328的博客 508

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java轻量级MVC框架Struts2 2.5详解(6)struts2文件上传和下载

一、Struts2中简单的文件上传 1):表单必须使用POST方式提交; 2):使用二进制编码:enctype="multipart/form-data"; 3):&lt;input type="file" name=""/&gt;; 4):通过struts2标签生成表单 5):Action中通过Set()方法获得表单中的数据 6):将通过网络获...

葡萄藤的博客 2973

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

spring 拦截器_Spring、Spring MVC、Struts2优缺点整理

Spring 及其优点大部分项目都少不了Spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢Spring是什么:Spring是一个轻量级的DI和AOP容器框架。说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类。DI:称作依赖注入(Dependen...

weixin_39871562的博客 262

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java框架总结

本系列用来记录常用java框架的基本概念、区别及联系,也记录了在使用过程中,遇到的一些问题的解决方法,方便自己查看,也方便大家查阅。 欲速则不达,欲达则欲速! 一、SSH 1、基本概念 SSH框架是JAVA EE中三种框架所集成,分别是Struts,Spring,Hibernate框架所组成,是当前比较流行的java web开源框架。 集成SSH框架的系统从职责上分为(Struts2--...

学Java,找哪吒 6万+

Struts2框架

1.MVC思想 Java Web应用结构经历了Model1和Model2两个时代: Model1——JSP + JavaBean模式 整个Web应用几乎全部由JSP页面组成,用少量的JavaBean来处理数据库连接、数据库访问等操作。 Model2——MVC模式 基于MVC架构,Servlet做为前端控制器,负责接收客户端发送的请求,Servlet中只包含控制逻辑和简单的前端处理,然后调用后端...

wqwq093030的博客 573

SpringMVC 、Struts2之间的区别

一、Spring与SpringMVC的区别: spring是一个开源框架,是为了解决企业应用程序开发,功能如下: 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 1、轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是...

5578

Java轻量级MVC框架Struts2 2.5详解(5)struts2的输入校验

一、输入校验: 1.客户端校验:  过滤正常用户的误操作,通过JS代码完成(可以绕开). 2.服务端校验:  整个应用阻止非法数据的最后防线(必须),使用Java代码. 3.数据库校验:  在数据库中通过约束来限制列的存储. 二、Struts2校验方式 1.编写代码方式校验:开发中常用; 2.配置校验:   2.1.基于XML配置校验(推荐使用)。   2.2.基于Annotati...

葡萄藤的博客 519

SSH与SSM框架对比:从Struts 2到Spring MVC 5的3个核心演进点

本文深度对比了SSH与SSM框架在Java企业级开发中的核心差异,重点分析了从Struts 2到Spring MVC 5的3个关键演进点:架构设计、性能表现和扩展机制。通过代码示例和性能数据,揭示了SSM框架在方法拦截、SQL可控性和微服务适配等方面的优势,为现代Java项目选型提供实践指导。

weixin_30564785的博客 341

JavaEE--------Struts2框架

一. Struts2框架的概述 Struts2 是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web 开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握Struts2 框架几乎成为Web开发者的必备技能之一。接下来将针对Struts2 的特点、安装以及执行流程等内容进行详细的讲解。 1.1 Struts2 简介 Struts2是一个基于MVC设...

詹煜彪9527 7378
上一篇: Java轻量级MVC框架Struts2 2.5详解(3)Action访问ServletApi、获取参数
下一篇: Java轻量级MVC框架Struts2 2.5详解(5)struts2的ValueStack值栈
openbox2008
博客等级 码龄9年 147粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值