struts2 1-基础篇

原文链接:http://blog.youkuaiyun.com/qimiguang/article/details/7934626

Struts2的核心是通过拦截器(动态代理)实现的。

拦截器和过滤器实现的功能基本相同,但是实现原理不同。

拦截器   的实现原理:  动态代理

过滤器   的实现原理:  函数调用

 

1struts2的执行流程:  
    当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给哪个WebApplication来处理,然后会读取它的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>

因为<url-pattern> /*,所以它会过滤所有的请求然后都交给filter:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter处理执行调用doFilter()方法,在doFilter()方法中会读取struts.xml文件,根据用户请求的地址找到相应的package、 action,在action中执行完一定的操作后,根据它的返回值执行相应的result,跳转到某一新的页面(默认是dispatcher跳转,在知识点13会详细讨论),然后将该页面返回给浏览器。 

2struts2的命名空间namespace

namespace决定了action的访问路径,默认为"",可以接收所有路径的action。namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,/xxx/index.action,或者/xxx/yyy/index.action(action可以不写)  
namespace最好也用模块来进行命名  

如果在url中写http://localhost:8080/Struts2_0400_Path/,而在struts.xml中没有对应的namespace-->"/",则会交给tomcat进行处理,tomcatweb.xml<welcome-file-list>,访问这里面定义的文件。

3struts1 struts2的一个重要区别:在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访问都会创建一个Action对象,所以struts2不会有线程安全问题的发生

4<result>标签如果没有指定name属性,默认返回值为“success”

   <action>标签中的class值如果没有配置相应的类,它会调用struts默认的一个处理类ActionSupportexecute()方法,返回SUCCESSpublic static final String SUCCESS = "success";).

5实现struts的处理类的时候不要自己随便写类然后定义execute()方法,也不要实现Action而要从ActionSupport类继承,这样便可以直接使用它为我们定义好的方法.(可以根据需要来重写execute()方法)。

6、路径问题:

struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。 

解决办法非常简单,统一使用绝对路径,譬如:

定义了:

当访问http://localhost:8080/Struts2_0400_Path/path/path时,会导入到path.jsp页面中,在path.jsp中,如果直接写:<a href="index.jsp">index.jsp</a>(相对路径),那么将访问的是http://localhost:8080/Struts2_0400_Path/path/index.jsp,如果写<a href="/index.jsp">index.jsp</a>,则会访问到http://localhost:8080/index.jsp(访问到apache的官网那个页面了)。

解决方案:

path.jsp中:

这样直接访问<a href="index.jsp">index.jsp</a> 就行了。

(request.getContextPath()得到项目的名字,一般用来解决路径问题 如果项目为根目录,则得到一个"",即空的字条串。  
  request.getscheme()返回的协议名称.默认是http   
  request.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhost   
  request.getServerPort()获取服务的端口号

7动态方法调用:

action执行的时候并不一定要执行execute方法,可以在配置文件中配置action的时候用method=add来指定执行哪个方法(会产生太多的action,所以不推荐使用)。

 也可以在访问url地址中动态指定/**/**.action!add(动态方法调用DMI)(推荐)

8、通配符配置:

通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则

{1}代表name="Student_*"后面第一个'*',同理{2}代表第二个'*' 

如果action之间有重复配置,struts2会匹配最精确的action。而只要是包括*则是同一级,哪个在前匹配哪个。

9、接受action传过来的参数:

(1)、用Action的属性接收参数

在继承ActionSupport的类中定义要接受的参数,参数的名称与action所传的名称无关,在struts2内部调用的是属性的set方法,所以setxxx()的名字一定要与action后面所传的值是一样的。

(2)、用DomainModel接收参数
     如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象,例如:  
      private User user set get 方法)在调用action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递。(最常用的方式

(3)、用ModelDriven接收参数(不常用)

10Struts2_访问Web元素

访问http://localhost:8080/Struts2_1200_AccessWebElements/login/login

系统自动将requestsessionapplication注入到LoginAction中,然后默认调用execute()方法,往requestsessionapplication中添加值,根据返回的SUCCESS,进入到user_login_success.jsp页面,

点击【Debug】后显示的结果,它包含两部分:value stack以及stack context

在实际开发中很少去获取request,因为没必要,action中的成员变量(非requestsessionapplication会起到request的作用,即接受到来自页面的参数,然后放到成员变量中,而成员变量是存放在value stack的(value stack本身是放在stack context中的)。application也基本不用,当想放全局的内容时,1可以放数据库中,2可以自己定义一个Class。。所以基本就用控制反转IoCsession

如在action中:

那么在jsp页面中是这么来取

11、模块包含

struts2.xml

login.xml

12、访问默认action

13、结果类型:result type

result type的最常用的几种配置:(四种配置分别代表了四种不同的跳转方式)  

14、全局结果集 

首先访问:http://localhost:8080/Struts2_1600_GlobalResult/index.jsp

Index.jsp页面代码:

struts2.xml代码:

UserAction代码:

AdminAction代码:

 

假如有许多action,他们都有一个共同的result,如果在每个action中配置一行,那么会很繁琐,所以我们把这个公共的result写在globalresult中,指在这个package中,所有的action都可以共用的结果集。而如果另外一个package也想用这个结果集,那么让这个包extends上一个包,则上个包的配置这个包也就全部都有了。

譬如在一个项目中分了4个模块,每个模块有自己单独的配置,但是譬如出了错返回错误页面,或者访问不存在的action时回到主页,这些东西不需要在每个模块中都配,所以可以定义一个包,然后让其他的包都继承这个包。

15、动态结果集dynamic result:

index.jsp页面:

strust2.xml代码:

UserAction代码:

16、带参数的结果集

当从一个action dispatcher服务器端跳转)到另一个action时,这两action是共享同一个value stack,即一次request(服务器端的dispatcher对于客户端就是一次request)只有一个value stack,第二个action是可以直接读取前一个action的里面的值,不需要传递参数

但如果是客户端跳转(redirect)的方式进行跳转,实际上是发出了两次request,所以他们不共享value stack,原来value stack中的值后面访问不了了,所以需要传递参数,进行如下的配置:  

当在index.jsp中点击“传参数”时:

struts.xml代码:

UserAction代码:

转向的user_success页面的代码:

Result总结:


基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值