struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)
一. struts2的产生
struts1的缺点:
1. ActionForm过多,而且这个ActionForm在很大程度上又和VO(POJO)重复
2. 为了解决ActionForm过多的问题,使用了验证框架,但是配置复杂,因为是后期的产物
3. 与Spring的整合开发难度太大,配置过多
struts1之所以有这些问题,是因为在struts1产生的年代之中没有将POJO的概念提到一个重要的领域上来。但是与struts1同时产生的MVC设计框架(JSF、WebWork)开始逐步解决了这些问题,而其中仅次于struts1框架的就是WebWork,WebWork解决了所有Struts1的所有问题,而且使用起来更加简单,但是Struts1已经成为了行业的标准,名气比WebWork大,所以WebWork的发展比较难。后来Apache组织发现了WebWork的优点,就将其收为自己的一个子项目,利用这个子项目推出了一个新的框架——Struts2.0。因为在最早的Struts2.0之中,基本上就是将<webwork>节点更换成了<struts>节点,除此之外没有任何的变化,甚至连核心包Xwork.jar都是一样的,所以struts2=struts1的名气+WebWork的易用性
二. struts2的工作流程
1.struts 1.x的工作流程
struts 1.x所有的请求以".do"的形式发送到ActionServlet之中,之后由ActionServlet根据struts-config配置文件指定的操作找到对应的Action及ActionForm,默认调用ActionForm中的validate()方法,之后如果此方法返回null或者ActionErrors的集合中没有任何内容,则表示一切正确,如果有错误了,则跳转到struts-config文件中配置的input路径进行跳转,并通过<html error>进行错误显示,如果没有错误则继续交给Action执行。
2. struts 2.x的工作流程
从代码的角度来讲struts 2.x的代码更加简单,因为ActionForm没有了,而且配置也不麻烦了。
从工作流程上来讲,由于 struts 2.x配置的操作是一个过滤器:StrutsPrepareAndExecuteFilter,现在所有的请求肯定先找到过滤器上(struts 2.1之后过滤器有两种:StrutsPrepareFilter和StrutsExecuteFilter),之后根据请求的操作从struts.xml文件之中取出配置的信息,调用ActionSupport的子类中的excute()方法,并根据<result>节点的路径进行跳转操作。
三、搭建struts2开发环境
1.在eclipse里面新建一个maven的web项目,名称为TestStruts2,参考文章:http://www.cnblogs.com/NieXiaoHui/p/5990570.html
2.引入struts2的相关依赖,见pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>TestStruts2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>TestStruts2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency> <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.15</version>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>2.7.3</version>
</dependency>
<!--struts2的核心配置文件 begin -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<version>2.2.1</version>
</dependency>
<!--struts2的核心配置文件 end -->
</dependencies>
<build>
<finalName>TestStruts2</finalName>
</build>
</project>
3.在src/main/java目录下新建一个struts2的主配置文件struts.xml和一个struts-user.xml配置文件,在struts.xml里面引入struts-user.xml,配置内容如下
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>
<include file="struts_user.xml" />
</struts>
struts-user.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> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> </package> </struts>
4.web.xml里面引入struts2的过滤器StrutsPrepareAndExecuteFilter
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
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_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!--struts2的核心过滤器,所有的请求都先到这里,之后根据请求的操作从struts.xml文件之中取出配置的信息,
调用ActionSupport的子类中的excute()方法 -->
<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>
5. 在src/main/java新建一个包com.study.struts2.demo,在里面编写一个HelloWorldAction.java,在struts-user.xml里面配置这个action
HelloWorldAction.java:
package com.study.struts2.demo; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { /**
*
*/
private static final long serialVersionUID = 6522825387249101847L; private String msg; @Override
public void validate() {
if (msg == null || "".equals(msg)) {
super.addFieldError("msg", "信息不能为空"); }
} @Override
public String execute() throws Exception { // 通过request取得jsp的内置对象
// this.msg="hellowrold123";
return SUCCESS;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} }
struts-user.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> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result name="success">index.jsp</result>
</action> <action name="hello" class="com.study.struts2.demo.HelloWorldAction"
method="execute">
<result name="success">index.jsp</result>
<result name="input">index.jsp</result>
</action> </package> </struts>
6.编写index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!--引入struts2的标签 -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<body>
<p>
<a href="<s:url action='hello'/>">Hello World</a>
</p> <!--struts2的取值标签 value="<s:property value="msg" />"输入正确的被保留 -->
<form action="hello.action">
信息:<input type="text" name="msg" value="<s:property value="msg" />" />
<s:property value="fieldErrors['msg'][0]" />
<br> <input type="submit" value="提交">
</form> <!--验证通过后显示 -->
<h2>
<s:property value="msg" />
</h2>
</body>
</html>
经过上面的几步struts2的开发环境已经搭建完成,下面在tomcat里面启动项目,在浏览器输入地址http://localhost:8080/TestStruts2访问验证
struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)的更多相关文章
- Windows搭建python开发环境,python入门到精通[一]
从大学开始玩python到现在参加工作,已经有5年了,现在的公司是一家.net的公司用到python的比较少,最近公司有新项目需要用到python,领导希望我来跟其他同事training,就有了这篇博 ...
- visual studio 2015 搭建python开发环境,python入门到精通[三]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...
- Groovy轻松入门——搭建Groovy开发环境
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...
- 使用Ant搭建Android开发环境入门
使用Ant搭建Android开发环境入门 使用Ant搭建Android开发环境,建立android项目 配置Ant环境 下载Ant:http://ant.apache.org/bindownloa ...
- Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置
原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...
- GEF入门实例_总结_01_教程、源码、开发环境准备
一.前言 最近在学Eclipse插件开发,发现了一个比较好的GEF入门教程,并且按照教程上的操作,一步步实现了一个入门Demo,在此感谢作者的贡献. 好记性不如烂笔头,故决定总结一下这段时间的学习心得 ...
- 入门: 在Windows上搭建Flutter开发环境
使用镜像 由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中: export PUB_HOSTED_URL=htt ...
- 【OpenCV入门教程之一】 OpenCV 2.4.8 +VS2010的开发环境配置
目录(?)[-] 因为读研期间的研究方向是图像处理所以浅墨这段时间闭门研究了很多OpenCV和图像处理相关的知识与内容眼看自己积累到一定的程度了于是决定开始开设这个OpenCV系列专栏总结自己所学也分 ...
- Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境
一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...
- [Linux] PHP程序员玩转Linux系列-搭建代码开发环境
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的 ...
随机推荐
- android笔记---百度地图api应用 (一)
package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...
- 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法
本篇文章小编为大家介绍,用NPOI创建Excel.合并单元格.设置单元格样式.边框的方法.需要的朋友参考下 今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Ex ...
- Gunicorn使用详解
1.什么是Gunicorn Gunicorn是一个WSGI HTTP服务器,python自带的有个web服务器,叫做wsgiref, Gunicorn的优势在于,它使用了pre-fork worker ...
- Linux--多网卡的7种Bond模式【转】
转自:http://www.cnblogs.com/lcword/p/5914089.html 网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是一 ...
- openfire ping的smack解决方案(维持在线状态)
连接中关联如下: // iq提供者 roviderManager.getInstance().addIQProvider("ping", "urn:xmpp:ping&q ...
- QQ通信原理及QQ是怎么穿透内网进行通信的?
http://blog.csdn.net/frank_good/article/details/51160027 ******************************************* ...
- SVN如何切换账号
https://www.cnblogs.com/six-moon/p/5233878.html **************************************************** ...
- Mysql 多表查询详解
Reference: https://blog.csdn.net/jintao_ma/article/details/51260458 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql ...
- SQL Server 数据库自建表
sysobjects是系统自建的表,里面存储了在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等). 列名 数据类型 描述 name sysname 对象名 id int 对象标识号 xt ...
- python 下载虾米音乐
#!/usr/bin/env python2 # coding:utf-8 import urllib import re import sys import urllib2 # xml => ...