一、Strut1和Strut2的主要区别

在Action的实现方面
Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO。
线程模型方面
Struts1的Action是单实例的,一个Action的实例处理所有的请求。Struts 2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
Servlet依赖方面
Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
封装请求参数
Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
表达式语言方面
Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。
绑定值到视图技术
Struts1使用标准的JSP,Struts2使用“ValueStack”技术。
类型转换
Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。
Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
Action执行控制的对比
Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。
拦截器的应用
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

二、简单实例

  • web.xml(这里有一个小细节,对于struts.xml文件我们是要放在src目录下的,要不然会出现500)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><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-app>
  • struts.xml(注意配置namespace之后,对于<s:form ><s:a>这些的url怎么写,都会自动加上.action)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><!-- 在struts.xml中开启该常量。 --><constant name="struts.devModel" value="true"/><package name="my" extends="struts-default" namespace="/www"><interceptors><interceptor name="islogin" class="com.struts2.intercept.IsLoginInterceptor"/><interceptor-stack name="teamwareStack"><interceptor-ref name="islogin"/><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors><default-interceptor-ref name="teamwareStack"/><default-action-ref name="index" /><global-results><result name="NoLogin" type="redirect">/index.jsp</result><result name="error" type="redirect">/error.jsp</result></global-results><!-- 定义处理请求URL为login.action的Action --><action name="index" class="com.struts2.action.LoginAction" method="doIndex"><!-- 定义处理结果字符串和资源之间的映射关系 --><result name="non">/index.jsp</result></action><action name="login" class="com.struts2.action.LoginAction" method="doLogin"><result>/index.jsp</result><!-- 定义处理结果字符串和资源之间的映射关系 --><result name="success">/success.jsp</result></action><action name="show" class="com.struts2.action.LoginAction" method="doShow"><!-- 定义处理结果字符串和资源之间的映射关系 --><result name="success">/show.jsp</result></action></package></struts>
  • index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>登陆</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><s:form action="login" method="post" namespace="/www"><table align="center" bgcolor="pink"><tr align="center"><td colspan="2">欢迎登陆</td></tr><tr><td>用户名</td><td><input type="text" name="u.username"/></td></tr><tr><td>密码:</td><td><input type="text" name="u.password"/></td></tr><tr align="cnter"><td colspan="2"><input type="submit" value="登陆"/></td></tr></table></s:form></body>
</html>
  • success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>登陆成功</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><h1>登录成功后显示此页面</h1>  <s:a href="www/show">开始访问</s:a> </body>
</html>
  • show.jsp和error.jsp一样,里面加了一个<s:a>标签返回到index.jsp
  • User.java
package com.struts2.model;public class User {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;}}
  • LoginAction.java
package com.struts2.action;import com.opensymphony.xwork2.ActionSupport;
import com.struts2.model.User;public class LoginAction extends ActionSupport{private User u = new User();public User getU() {return u;}public void setU(User u) {this.u = u;}public String doLogin(){return "success";}public String doShow(){return "success";}public String doIndex(){return "non";}@Overridepublic void validate() {super.validate();}}
  • IsLoginInterceptor.java(定义一个拦截器,在所有action执行之前都判断是否用户登陆了,没有的话就跳到登陆页面)
package com.struts2.intercept;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class IsLoginInterceptor extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation invocation) throws Exception {ActionContext ctx = invocation.getInvocationContext();Object username= ctx.getParameters().get("u.username");/*if (username != null) { return invocation.invoke();  }  return "NoLogin";  */return invocation.invoke();  }
}
  • 【注】因为我发现username并不是理想中的文本框的值,不知道为什么得到的是String类对象,ctx.getParameters()里面得到的是[u.username=Java.Lang.String,u.password=Java.Land.String]可能是因为我在Action里面使用的是User这个对象吧。
  • 其次,不知道怎么保持登陆信息,是每次method的时候保存在session里面比较好呢还是用一个隐藏文本框?或者再加一个拦截器。

Strut2简单使用相关推荐

  1. 检查点重做检查点队列简单总结Strut2教程-java教程

    本篇文章朋友在北京游玩的时候突然想到的...这几周就有想写几篇关于检查点重做的文章,所以回家到之后就奋笔疾书的写出来发布了 1.Oracle日记理原 REDO流(重做日记流) RBA (重做节字址地由 ...

  2. Strut2中单元测试实例

    项目文件结构图: 椭圆框中的Jar 包是单元测试时候需要引入的. 矩形框 MainTest 每个包下一个,为 JUnit4 的 Suite 套件,其作用是执行本包下的"测试类"和子 ...

  3. ssh框架的学习之strut2小测试(2)

    基于上次配置好的工程来说: 一.完善strut2文件: 添加信息如下: <package name="storm" namespace="/test" e ...

  4. 最简单的视频网站(JavaEE+FFmpeg)

    本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&qu ...

  5. 最简单的视频网站(JavaEE+FFmpeg) 转载自: Mr.Rico

    本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的 SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&q ...

  6. java movie_最简单的视频网站(JavaEE+FFmpeg)

    本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的 SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&q ...

  7. FFMPEG--最简单的视频网站(点播、直播)

    本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的 SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&q ...

  8. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

  9. Linux下tomcat的安装与卸载以及配置(超简单)

    无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...

  10. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

最新文章

  1. 数据结构源码笔记(C语言):置换-选择算法
  2. 使用Spring Security3的四种方法概述
  3. JavaScript基础事件(6)
  4. 一份详尽的利用 Kubeadm部署 Kubernetes 1.13.1 集群指北
  5. 驾驶证损毁、驾驶人信息变更的如何换证
  6. 【BZOJ4455】小星星,容斥原理+树形DP
  7. Unknown system variable 'query_cache_size'
  8. 第五话 Asp.Net MVC 3.0【MVC实战项目の一】
  9. 如何压缩jpg图片的大小
  10. 1.3 三种交换方式:电路交换、分组交换、报文交换
  11. String对象intern方法
  12. jQuery EasyUI教程
  13. wifi万能钥匙破解隔壁无线网以及查看破解密码
  14. python多线程读取列表
  15. 《数值分析(原书第2版)》—— 2.4 PA=LU分解
  16. Basic Paxos算法
  17. 【Mybatis系列】之插件—自动填充字段插件,再也不需要手动填写或者耦合业务了!
  18. 装机必备,微软常用运行库合集 2022最新版
  19. 债券质押式正逆回购详细操作指南
  20. 图神经网络简介,什么是图神经网络,GNN

热门文章

  1. web 视频演示,MP4小视频免费下载
  2. 详解PON基础知识:OLT、ONU、ONT和ODN
  3. Excel 学习心得2
  4. 步步深入:MySQL 架构总览->查询执行流程->SQL 解析顺序(转)
  5. stanford coreNLP简单使用
  6. 基于Tofino2的64X100GE高性能可编程交换机MX7636-64X
  7. 方舟仙境服务器什么时候修复,方舟生存进化官服多久删一次服务器
  8. 英读廊——随时来串门吧!是真心的邀请,还是塑料的友情?
  9. 【专栏】核心篇07| Redis “jio”美的集群模式
  10. 【JavaScript】为什么是script error.