struts1的工作原理及基本配置详解

Struts2工作原理及代码 【代码】Struts2工作原理及代码。 阅读详情

一、引入struts

Model 1结构如图1所示:


    Mode11是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑,也负责控制逻辑。专业书籍上称之为逻辑耦合在页面中,这种处理方式,对一些规模很小的项目如:一个简单的留言簿,也没什么太大的坏处,实际上,人们开始接触一些对自己来说是新的东西的时候,比如,用JSP访问数据库时,往往喜欢别人能提供一个包含这一切的单个JSP页面,因为这样在一个页面上他就可以把握全局,便于理解。但是,用Model 1模式开发大型时,程序流向由一些互相能够感知的页面决定,当页面很多时要清楚地把握其流向将是很复杂的事情,当您修改一页时可能会影响相关的很多页面,大有牵一发而动全身的感觉,使得程序的修改与维护变得异常困难;还有一个问题就是程序逻辑开发与页面设计纠缠在一起,既不便于分工合作也不利于代码的重用,这样的程序其健壮性和可伸缩性都不好。     



Model 2引入了"控制器"这个概念,控制器一般由Servlet来担任,客户端的请求不再直接送给一个处理业务逻辑的JSP页面,而是送给这个控制器,再由控制器根据具体的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。因此,这个servlet控制器为应用程序提供了一个进行前-后端处理的中枢。一方面为输入数据的验证、身份认证、日志及实现国际化编程提供了一个合适的切入点;另一方面也提供了将业务逻辑从JSP文件剥离的可能。业务逻辑从JSP页面分离后,JSP文件蜕变成一个单纯完成显示任务的东西,这就是常说的View。而独立出来的事务逻辑变成人们常说的Model,再加上控制器Control本身,就构成了MVC模式。实践证明,MVC模式为大型程序的开发及维护提供了巨大的便利。

二、struts工作原理


来自客户的所有需要通过框架的请求,统一由ActionServlet接收(ActionServlet Struts已经为我们写好了,只要您应用没有什么特别的要求,它基本上都能满足您的要求),根据接收的请求参数和Struts配置(struts-config.XML)中ActionMapping,将请求送给合适的Action去处理,解决由谁做的问题,它们共同构成Struts的控制器。

Action则是Struts应用中真正干活的组件,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给客户。

这里要特别说明一下的是:就是Action这个类,它不应该包含过多的业务逻辑,而应该只是简单地收集业务方法所需要的数据并传递给业务对象。实际上,它的主要职责是:

校验前提条件或者声明

调用需要的业务逻辑方法

检测或处理其他错误

路由控制到相关视图

三、struts运行机制

Struts的工作流程:


在web应用启动时就会加载,初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,当ActionServlet接收到一个客户请求时,将执行如下流程.

    (1)检索和用户请求匹配的ActionMapping实例,如果不存在就返回请求路径无效信息;

(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;

(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;

(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;

(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;

(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;

(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

四、Struts1的安装与基本配置

我们主要针对Struts1.1版本进行讲解,这里假定读者已经配置好Java运行环境和相应的Web容器,本文例子所使用的是j2sdk和Tomcat4.1.27。下面,将采用类似于step by step的方式介绍其基础部分。

安装Struts到http://jakarta.apache.org/ 下载Struts的安装文件,本文例子使用的是1.1版。接下来您要进行如下几个步骤来完成安装:

1、解压下载的安装文件到您的本地硬盘

2、生成一个新的Web应用,假设我们生成的应用程序的根目录在/Webapps/mystruts目录。在server.xml文件中为该应用新建一个别名如/mystruts

3、从第1步解压的文件中拷贝下列jar文件到/Webapps/mystruts/WEB-INF/lib目录,主要文件有如下一些。

struts.jar commons-beanutils.jar

commons-collections.jar

commons-dbcp.jar

commons-digester.jar

commons-logging.jar

commons-pool.jar

commons-services.jar

commons-validator.jar

4、创建一个web.xml文件,这是一个基于servlet的Web应用程序都需要的部署描述文件,一个Struts Web应用,在本质上也是一个基于servlet的Web应用,它也不能例外。
    Struts有两个组件要在该文件中进行配置,它们是:ActionServlet和标签库。下面是一个配置清单

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3 //EN""http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri><taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri><taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri><taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</web-app>


上面我们在web.xml中完成了对servlet和标签库的基本配置,而更多的框架组件要在struts-config.xml中进行配置:

5、创建一个基本的struts-config.xml文件,并把它放在/Webapps/mystruts/WEB-INF/目录中,该文件是基于Struts应用程序的配置描述文件,它将MVC结构中的各组件结合在一起,开发的过程中会不断对它进行充实和更改。在Struts1.0时,一个应用只能有一个这样的文件,给分工开发带来了一些不便,在Struts1.1时,可以有多个这样的文件,将上述缺点克服了。需在该文件中配置的组件有:data-sources

global-execptions form-beansglobal-forwards action-mappings controller message-resources plug-in

配置清单如下:

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC"-//Apache Software Foundation//DTD Struts Configuration1.1//EN""http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
 <message-resourcesparameter="ApplicationResources" />
</struts-config>


因为Struts是建立在MVC设计模式上的框架,你可以遵从标准的开发步骤来开发你的Struts Web应用程序,这些步骤大致可以描述如下:
1、定义并生成所有代表应用程序的用户接口的Views,同时生成这些Views所用到的所有ActionForms并将它们添加到struts-config.xml文件中。
2、在ApplicationResource.properties文件中添加必要的MessageResources项目
3、生成应用程序的控制器。
4、在struts-config.xml文件中定义Views与 Controller的关系。
5、生成应用程序所需要的model组件
6、编译、运行你的应用程序.

五、ActionServlet

我们首先来了解 MVC 中的控制器。在 Struts 1.1 中缺省采用 ActionServlet 类来充当控制器。当然如果 ActionServlet 不能满足你的需求,你也可以通过继承它来实现自己的类。这可以在 /WEB-INF/web.xml 中来具体指定。

要掌握 ActionServlet,就必须了解它所扮演的角色。首先,ActionServlet表示 MVC 结构中的控制器部分,它需要完成控制器所需的前端控制及转发请求等职责。其次,ActionServlet 被实现为一个专门处理 HTTP 请求的 Servlet,它同时具有 servlet 的特点。在 Struts 1.1 中它主要完成以下功能:

接收客户端请求

根据客户端的 URI 将请求映射到一个相应的 Action 类

从请求中获取数据填充 Form Bean(如果需要)

调用 Action 类的 execute() 方法获取数据或者执行业务逻辑

选择正确的视图响应客户

此外,ActionServlet 还负责初始化和清除应用配置信息的任务。ActionServlet的初始化工作在 init 方法中完成,它可以分为两个部分:初始化 ActionServlet 自身的一些信息以及每个模块的配置信息。前者主要通过initInternal、initOther 和initServlet 三个方法来完成。

我们可以在 /WEB-INF/web.xml 中指定具体的控制器以及初始参数,由于版本的变化以及Struts 1.1 中模块概念的引进,一些初始参数被废弃或者移入到/WEB-INF/struts-config.xml 中定义。下面列出所有被废弃的参数,相应地在web.xml 文件中也不鼓励再使用。

application

bufferSize

content

debug

factory

formBean

forward

locale

mapping

maxFileSize

multipartClass

nocache

null

tempDir

ActionServlet根据不同的模块来初始化ModuleConfig 类,并在其中以 XXXconfig 集合的方式保存该模块的各种配置信息,比如 ActionConfig,FormBeanConfig 等。

初始化工作完成之后,ActionServlet 准备接收客户请求。针对每个请求,方法process(HttpServletRequest request, HttpServletResponse response) 将被调用。该方法指定具体的模块,然后调用该模块的 RequestProcessor 的 process 方法。

 

protected void process(HttpServletRequest request,
     HttpServletResponse response)
                  throws IOException, ServletException {
          RequestUtils.selectModule(request, getServletContext());
          getRequestProcessor(getModuleConfig(request)).process(request, response);
 }

RequestProcessor 包含了 Struts 控制器的所有处理逻辑,它调用不同的processXXX 方法来完成不同的处理。下表列出其中几个主要的方法:

方法

功能

processPath

获取客户端的请求路径

processMapping

利用路径来获得相应的 ActionMapping

processActionForm

初始化 ActionForm(如果需要)并存入正确的 scope 中

processActionCreate

初始化 Action

processActionPerform

调用 Action 的 execute 方法

processForwardConfig

处理 Action 返回的 ActionForward

六、ActionForm

对于 ActionForm 你可以从以下几个方面来理解它:

1、ActionForm 表示 HTTP 窗体中的数据,可以将其看作是模型和视图的中介,它负责保存视图中的数据供模型或者视图使用。Struts 1.1 文档中把它比作 HTTP 和 Action 之间的防火墙,这体现了 ActionForm 具有的过滤保护的作用,只有通过 ActionForm 验证的数据才能够发送到 Action 处理。

2、ActionForm 是与一个或多个 ActionConfig 关联的 JavaBean,在相应的 action 的 execute 方法被调用之前,ActionForm 会自动利用请求参数来填充自己(初始化属性)。

3、ActionForm 是一个抽象类,你必须通过继承来实现自己的类。

ActionForm 首先利用属性的 getter 和 setter 方法来实现初始化,初始化完毕后,ActionForm 的 validate 方法被调用,你可以在其中来检查请求参数的正确性和有效性,并且可以将错误信息以 ActionErrors 的形式返回到输入窗体。否则,ActionForm 将被作为参数传给 action 的 execute 方法以供使用。

ActionFormbean 的生命周期可以设置为session(缺省)和 request,当设置为session 时,记得在 reset 方法中将所有的属性重新设置为初始值。

由于 ActionForm 对应于 HTTP 窗体,所以随着页面的增多,你的 ActionForm 将会急速增加。而且可能同一类型页面字段将会在不同的ActionForm 中出现,并且在每个 ActionForm 中都存在相同的验证代码。为了解决这个问题,你可以为整个应用实现一个 ActionForm 或者至少一个模块对应于一个 ActionForm。

但是,聚合的代价就是复用性很差,而且难维护。针对这个问题,在 Struts 1.1 中提出了 DynaActionForm 的概念。

七、Action

我们通过继承 Action 类来实现具体的执行类。具体 Action 类的功能一般都在 execute(以前是 perform 方法)方法中完成,其中主要涉及到以下几个方面:

辅助 ActionForm 进行一些表单数据的检查。

执行必要的业务逻辑,比如存取数据库,调用实体 bean 等。

更新服务器端的 bean 数据,后续对象中可能会用到这些数据,比如在 JSP 中利用 bean:write 来获得这些数据。

根据处理结果决定程序的去处,并以 ActionForward 对象的形式返回给 ActionServlet。

提示:由于在 Action 和 ActionForm 中都可以实现验证方法,那么如何来安排它们之间的分工呢?一般来说,我们秉着 MVC 分离的原则,也就是视图级的验证工作放在 ActionForm 来完成,比如输入不能为空,email 格式是否正确,利用 ValidatorForm 可以很轻松地完成这些工作。而与具体业务相关的验证则放入 Action 中,这样就可以获得最大 ActionForm 重用性的可能。

前面我们提到过,我们主张将业务逻辑执行分离到单独的 JavaBean 中,而 Action 只负责错误处理和流程控制。而且考虑到重用性的原因,在执行业务逻辑的 JavaBean 中不要引用任何与 Web 应用相关的对象,比如 HttpServletRequest,HttpServletResponse 等对象,而应该将其转化为普通的 Java 对象。关于这一点,可以参考 Petstore 中 WAF 框架的实现思路。

此外,你可能还注意到 execute 与 perform 的一个区别:execute 方法简单地掷出 Exception 异常,而 perform 方法则掷出 ServletException 和 IOException 异常。这不是说 Struts 1.1 在异常处理功能方面弱化了,而是为了配合 Struts 1.1 中一个很好的功能 -- 宣称式异常处理机制。

八、宣称式异常处理

和EJB 中的宣称式事务处理概念类似,宣称式异常处理其实就是可配置的异常处理,你可以在配置文件中指定由谁来处理Action 类中掷出的某种异常。你可以按照以下步骤来完成该功能:

1、实现org.apache.struts.action.ExceptionHandler 的子类,覆盖execute 方法,在该方法中处理异常并且返回一个 ActionForward 对象

2、在配置文件中配置异常处理对象,你可以配置一个全局的处理类或者单独为每个Action 配置处理类

下表就定义了一个全局的处理类 CustomizedExceptionHandler,它被用来处理所有的异常。

 <global-exceptions>
 <exception
          handler="com.yourcorp.CustomizedExceptionHandler"
          key="global.error.message"
          path="/error.jsp"
          scope="request"
          type="java.lang.Exception"/>
 </global-exceptions>


其中具体的参数含义,可以参考 ExceptionHandler.java 源文件。

九、taglib

讲完了模型和控制器,接下来我们要涉及的是视图。视图的角色主要是由 JSP 来完成,从 JSP 的规范中可以看出,在视图层可以"折腾"的技术不是很多,主要的就是自定义标记库的应用。Struts 1.1 在原有的四个标记库的基础上新增了两个标记库 --Tiles 和 Nested。

其中 Tiles 除了替代 Template 的基本模板功能外,还增加了布局定义、虚拟页面定义和动态页面生成等功能。Tiles 强大的模板功能能够使页面获得最大的重用性和灵活性,此外可以结合 Tiles 配置文件中的页面定义和 Action 的转发逻辑,即你可以将一个 Action 转发到一个在 Tiles 配置文件中定义的虚拟页面,从而减少页面的数量。比如,下表中的 Action定义了一个转发路径,它的终点是 tile.userMain,而后者是你在 Tiles 配置文件中定义的一个页面。

 <!-- ========== Action Mapping Definitions ============================== -->
 <action-mappings>
 <!-- Action mapping for profile form -->
          <action path="/login"
                  type="com.ncu.test.LoginAction"
                  name="loginForm"
                  scope="request"
                  input="tile.userLogin"
                  validate="true">
                  <forward name="success" path="tile.userMain"/>
          </action>
 </action-mappings>


Tiles 配置文件:tiles-defs.xml

 

<!DOCTYPE tiles-definitions PUBLIC
 "-//Apache Software Foundation//DTD Tiles Configuration//EN"
 "http://jakarta.apache.org/struts/dtds/tiles-config.dtd">
 <tiles-definitions>
 <!-- =======================================================  -->
 <!-- Master definitions                                       -->
 <!-- =======================================================  -->
 <!-- Page layout used as root for all pages. -->
 <definition name="rootLayout" path="/tiles-layouts/rootLayout.jsp">
     <put name="titleString" value="CHANGE-ME"/>
     <put name="topMenu" value="/tiles-components/topMenu.jsp"/>
     <put name="leftMenu" value="/tiles-components/panel1.jsp"/>
     <put name="body" value="CHANGE-ME"/>
     <put name="footer" value="/tiles-components/footer.jsp"/>
 </definition>
 <!-- =======================================================  -->
 <!-- Page definitions                      -->
 <!-- =======================================================  -->
 <!-- User Login page -->
 <definition name="tile.userLogin" extends="rootLayout">
     <put name="titleString" value="User Login"/>
     <put name="body" value="/src/userLogin.jsp"/>
 </definition>
 <!-- User Main page -->
 <definition name="tile.userMain" extends="rootLayout">
     <put name="titleString" value="User Main"/>
     <put name="body" value="/src/userMain.jsp"/>
 </definition>
 </tiles-definitions>

而 Nested 标记库的作用是让以上这些基本标记库能够嵌套使用,发挥更大的作用。

十、Commons Logging接口

所谓的 Commons Logging 接口,是指将日志功能的使用与日志具体实现分开,通过配置文件来指定具体使用的日志实现。这样你就可以在 Struts 1.1 中通过统一的接口来使用日志功能,而不去管具体是利用的哪种日志实现,有点于类似 JDBC 的功能。Struts 1.1 中支持的日志实现包括:Log4J,JDK Logging API, LogKit,NoOpLog 和SimpleLog。

你可以按照如下的方式来使用Commons Logging 接口(可以参照 Struts 源文中的许多类实现):

 

package com.foo;
 // ...
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 //...
          public class Foo {
          // ...
          private static Log log = LogFactory.getLog(Foo.class);
          // ...
          public void setBar(Bar bar) {
                  if (log.isTraceEnabled()) {
                           log.trace("Setting bar to " + bar);
                  }
          this.bar = bar;
          }
 // ...
 }

而开启日志功能最简单的办法就是在 WEB-INF/classes 目录下添加以下两个文件:commons-logging.properties文件:

# Note: The Tiles framework now uses the commons-logging package to output different

information or debug statements.

Please refer to this package documentation to enable it. The simplest way to enable

logging is to create two files in

WEB-INF/classes:

# commons-logging.properties

# org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

# simplelog.properties

# # Logging detail level,

# # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").

#org.apache.commons.logging.simplelog.defaultlog=trace

org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog


simplelog.properties文件:

 # Logging detail level,

 # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").

 org.apache.commons.logging.simplelog.defaultlog=fatal

这里我们采用的日志实现是 SimpleLog,你可以在simplelog.properties 文件指定日志明细的级别:trace,debug,info,warn,error 和 fatal,从trace 到 fatal 错误级别越来越高,同时输出的日志信息也越来越少。而这些级别是和 org.apache.commons.logging.log 接口中的方法一一对应的。这些级别是向后包含的,也就是前面的级别包含后面级别的信息。

深入理解Java Web MVC框架:Struts与Spring MVC的工作原理及对比 Struts 1 是一个基于 MVC 设计模式的 Web 应用框架,它是早期 Java EE 开发者中最受欢迎的框架之一。Struts1 的主要目标是将业务逻辑与界面表现层分离,从而简化企业级应用的开发。Struts1 的工作流程可以简单分为接收请求、处理业务逻辑、返回响应三个步骤。拦截器是Struts2中非常重要的一个概念,它为处理请求提供了一个可插拔的机制。自定义拦截器的步骤如下:创建拦截器类并实现接口。在intercept方法中编写拦截逻辑。在struts.xml。 阅读详情

相关推荐

Frida动态Hook实战:逆向美团外卖mtgsig3.0签名算法

在移动应用安全与数据爬取领域,API签名是保障请求合法性与数据完整性的核心机制。其原理是通过特定算法,将请求参数、时间戳等动态要素加密生成唯一字符串,服务器端通过验签防止数据篡改与伪造。这项技术的核心价值在于,它构建了客户端与服务器之间的可信通道,是移动端数据交互安全的基础。在自动化测试、安全审计、市场数据分析等应用场景中,理解并能够获取或绕过签名验证是关键前提。本文聚焦于美团外卖App的核心签名参数mtgsig3.0,针对其复杂的算法逻辑,提供了一套基于Frida的动态Hook解决方案。通过Hook技术,

weixin_33935636的博客 834

Struts1介绍

struts:[strʌts]支柱; 撑杆; 支杆; 支撑; 趾高气扬的步态; 高视阔步的样子; 引入struts Model1结构如图1所示: Model1是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑,也负责控制逻辑。专业书籍上称之为逻辑耦合在页面中,这种处理方式,对一些规模很小的项目如:一个简单的留言簿,也没什么太大的坏处,实际上,人们开始接触一些对自己来说是新的东西的时候,比如,用JSP访问数据库时,往往喜欢别人能提供一个包含这一切的单个JSP页面,因为这样在..

顺其自然~专栏 2945

保姆级教程 | MS构建三层石墨后转成LAMMPS的data文件

喜欢的话记得一键三连~

baguette的博客 2952

重温经典struts1之搭建环境

搭建struts1框架并实现简单的login功能

dy051107的博客 1557

c语言压力变送器程序设计,基于单片机的压力变送器设计

基于单片机的压力变送器设计(任务书,开题报告,外文翻译,论文15000字,代码)摘要随着工业化水平的不断提高,新型智能仪表在工业生产过程中运用也越来越广泛,同时对输出数据的准确检测和处理也变得至关重要。生产过程的运行和设备安全是极其重要的,那么如何实现对其精确的检测呢?众所周知,在工业生产过程中有一个很重要参数——压力,显然这个参数是一个必不可少的条件。故而,研究智能压力变松器系统对工业生产有着不...

weixin_33681561的博客 1963

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1405

入门Struts1第一讲——Struts1入门就这么简单

现在终于进入框架的学习中了,前面还有好几个框架等待着我们呢。我们先来学习Struts1框架,然后再过渡到Struts2框架的学习中。下面我们开始学习Struts1框架。Struts简介Struts是apache开发的一个web层的框架,它主要用于简化web层的开发,Struts针对web层的一些常用操作,例如: 表单数据的封装、校验和数据的回显 国际化开发 文件上传 异常处理 等等…Struts都提

李阿昀的博客 2万+

WSL中使用VMD图形化界面

【代码】WSL中使用VMD图形化界面。

handsome213的博客 841

Struts1 工作原理浅析

[color=red]一、引入struts[/color] Model 1结构如图1所示: [img]http://dl.iteye.com/upload/attachment/0076/5828/8a1cb5e1-4530-3f2c-b96d-c10300b00b07.jpg[/img] Mode1 1是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑...

yingrenzhe68的专栏 434

Unity物理引擎实战:从刚体重心到碰撞体,打造真实不倒翁交互

刚体(Rigidbody)是Unity物理系统的核心组件,它定义了游戏对象的物理属性,如质量、阻力和碰撞响应。其原理基于牛顿力学,通过物理引擎(如PhysX)实时计算物体的运动状态。在游戏开发中,刚体的价值在于能够模拟真实世界的物理行为,为玩家提供沉浸式的交互体验。碰撞体(Collider)则定义了物体的形状边界,用于检测与其他物体的接触。通过精细调整刚体的重心(Center of Mass)和碰撞体形状,开发者可以模拟出各种有趣的物理现象,例如低重心物体的动态平衡。这在休闲游戏、物理玩具模拟等场景中尤为实

weixin_33976326的博客 355

YOLO11实战优化:暗光环境检测 | 引入Retinex增强模块与YOLO11联合训练,解决夜间/低照度场景抓拍痛点

本文探讨了暗光环境下目标检测的技术挑战与解决方案。研究发现,传统CNN模型在低照度条件下性能显著下降,主要由于光子数减少导致信噪比降低、目标特征被噪声淹没。针对这一问题,文章提出将可微分光照增强模块嵌入YOLO检测器的技术路线,重点分析了Retinexformer+YOLO11联合方案的优势。 文章对比了YOLO系列模型在暗光场景的表现,指出YOLO11凭借其C3k2模块、无锚检测头和多任务统一骨干网络,在低对比度图像特征提取方面优于前代产品。同时详细介绍了Retinexformer的理论基础和技术创新,包

2601_95807009的博客 206

J2EE学习篇之--Struts1详解

今天来看一下Struts1的相关知识,其实Struts现在是出名的,每个Web开发者都会知道的,也是现在比较流行的框架,下面就来看一下我们为什么要用Struts框架呢? 摘要 1.建立在mvc这种好的模式上的,Struts在m,v,c上都有涉及,但主要的是提供一个好的控制器和一套定制的标签库上也就是说它在这里体现在c和v上,有mvc的一系列的优点,如:结构层次分明,高重用性,增加了程序的健...

810364804 904

CATIA文件的网页预览方案

CATIA是工业设计中广泛使用的专业软件,产出`.CATPart`或 `.CATProduct`等文件类型,当资产数量较大时,我们希望快捷预览这些文件,就有了`CATPart`文件网页预览的需求 但我们知道,网页上无法直接渲染`CATPart`这种复杂的文件, CATIA生成的文件(如 `CATPart` 和 `CATProduct`)不仅包含三维几何信息(例如点、线和曲面),还涵盖了丰富的元数据与专业设计特征。 那有没有办法,能实现CATIA文件在网页上的便捷预览?

weixin_44211633的博客 1450

Struts1工作原理

Struts1工作原理图 1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想) 2、发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协...

sinolover的专栏 2109

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

struts1工作原理

最近刚刚结束了SSH的学习,其实我觉得那不叫结束,是java学习的一个真正的入门,其中包含很多非常精华的思想,让我想到一句话:“为人民服务”,不管是用户,还是开发人员,特点是都是人,老师说过:你设计的软件,xx都会用了,那你就是精英,其实更近一步说,如果一个框架能够让一般的开发人员很容易上手,那这个框架也是一个非常优秀的框架,在学习SSH的这段时间,我学习的每一步都能够体会到当初设计这个框架的人的智慧,真的很棒,首先从struts1说起。 虽然strut2被我们熟知,并且常用,但是没有s

变是永远不变的...... 2739

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Struts1、Struts2、Hibernate、Spring框架工作原理介绍

Struts1工作原理 Struts1工作原理图 1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)   2、发送请求:用户提交表单或通过URL向WEB服务器提

The Best Or Nothing~ 5331

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

struts1配置详解

1、首先我们来简单总结以下struts1的处理流程  首先:由视图层发出请求,当 ActionServlet 接收到 HTTP 请求后,在 doGet 或 doPost 方法中都会调用process()方法处理请求 其次:在ActionServlet 的 process() 方法中一旦选择了正确的子应用模块,就会调用RequestProcessor实例的process()方法来处

ryan1214的专栏 876

struts1.2 和 struts2 配置详解

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Style

你的专栏 3441

struts1学习之--5、Struts1的工作原理和开发流程

Struts1的工作原理和开发流程: 1、读取配置(初始化ModuleConfig对象)   struts框架总控制器(ActionServlet)是一个servlet,在web.xml中配置成自动启动的servlet。    读取配置文件(struts-config.xml)的配置信息。为不同的struts模块初始化相应的ModuleConfig对象。   2,发送请求

左岸人的博客 1万+

【Struts1】Struts1的配置和原理详解

Action, ActionForm, ActionForward ,这三个对象构成了Struts 的核心。  Struts 最核心的控制器是ActionServlet ,该Servlet 拦截用户请求,井将用户请求转入到Struts 体系内。  一、配置ActionServlet  ActionServlet 是一个标准的Servlet ,在web.xml 文件中配置,该Servlet 用

qq_827625738的博客 286

struts1.x基本action的配置与使用

struts1.x基本action的配置与

hakunamatata2008的专栏 7322

struts1的配置文件详解

要想使用Struts,至少要依靠两个配置文件:web.xml和struts-config.xml。其中web.xml用来安装Struts框架。而struts-config.xml用来配置在Struts框架中要使用的资源。如Formbean、Action、插件等。如果使用了某些插件,如Validator、Tiles等。还可能需要其他的配置文件。虽然在前面的文章中已多次使用了这两个配置文件,但都是分散

张小可爱的IT之路 5346

Struts2的配置文件的配置struts.xml

在学习struts的时候,我们一定要掌握struts2的工作原理。

zzjmay的专栏 2437

Struts1详解 适合快速学习老项目的同学

今天来看一下Struts1的相关知识,其实Struts现在是出名的,每个Web开发者都会知道的,也是现在比较流行的框架,下面就来看一下我们为什么要用Struts框架呢? 摘要 1.建立在mvc这种好的模式上的,Struts在m,v,c上都有涉及,但主要的是提供一个好的控制器和一套定制的标签库上也就是说它在这里体现在c和v上,有mvc的一系列的优点,如:结构层次分明,高重用性

isunlight001的专栏 9402
上一篇: struts1的工作原理
下一篇: struts2的执行流程及工作原理
会淹死的鱼
博客等级 码龄16年 23粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值