前面一篇博客(实现struts2框架)带大家对基于mvc业务流程熟悉了一下,现在我们就用对mvc实现最好的框架struts2来开发一个应用实例。虽然现在MyEclipse8.5以上版本已经开始支持Struts2,但为了我们能更好的熟悉开发struts2的业务流程,现在我们还是手动去搭配环境。首先我们需要到struts.apache.org去下载struts-2.2.3-all包。现在最高版本应该达到2.3了。要想正常使用Struts2,至少需要如下五个包(可能会因为Struts2的版本不同,包名略有差异,但包名的前半部是一样的)。

struts2-core-2.0.11.1.jar

xwork-2.0.4.jar

commons-logging-1.0.4.jar

freemarker-2.3.8.jar

ognl-2.6.11.jar

注:貌似好像一些高版本的还需要加入一些其他jar包,如下图所示:

好了,jar包加入之后,我们下一步开始搭配配置环境了。很多同学可能会有这样的疑问,为什么我提交的请求能到struts.xml去找对应的action呢??至少我刚开始学习的时候有这么个疑问。现在答案即可以为大家揭晓了,因为struts2的核心是拦截器,一切请求都要经过拦截器才转发给所对应的action的。Struts2中第一个拦截请求的就是org.apache.struts2.dispatcher.FilterDispatcher这个拦截器(下一篇博客我们即将对这个拦截器的源码进行分析),拦截器对请求进行一些处理之后然后去struts.xml寻找对应的action。我们一起来看一下web.xml的配置:

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <web-app version="2.4"

  3. xmlns="http://java.sun.com/xml/ns/j2ee"

  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  5. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

  6. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  7. <filter>

  8. <filter-name>struts2</filter-name>

  9. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

  10. </filter>

  11. <filter-mapping>

  12. <filter-name>struts2</filter-name>

  13. <url-pattern>*.action</url-pattern>

  14. </filter-mapping>

  15. <welcome-file-list>

  16. <welcome-file>index.jsp</welcome-file>

  17. </welcome-file-list>

  18. </web-app>

在struts2官方提供的文档中要求,在服务器class文件夹下建立struts.xml文件。由于在web项目部署到服务器上,开启服务器对web项目进行编译时会自动把src文件夹下的文件加载到服务器class文件夹下,所以我们直接在src下面建立struts.xml文件,具体struts.xml配置如下:

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE struts PUBLIC

  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

  4. "http://struts.apache.org/dtds/struts-2.0.dtd">

  5. <struts>

  6. <constant name="struts.i18n.encoding" value="utf-8" />

  7. <package name="struts2" extends="struts-default">

  8. <action name="" class="">

  9. <result name=""></result>

  10. <result name=""></result>

  11. </action>

  12. </package>

  13. </struts>

注:上述代码具体意义:

1.<constant>标签主要是用来修改struts.properties配置文件信息,name和value分别相当于struts.properties文件中的name和value

2.<package>主要是作为分包作用,比如一个项目分好几个模块,这里可以每一个模块分配一个包,一个struts.xml文件中可以出现多个<package>标签,这里一定要有extends="struts-default",因为struts的核心拦截器都配置在struts-default包中,如果没有这个,所有请求都不会请求到

3.一个<action>标签对应一个action类,主要是通过action标签中的去寻找class,然后执行对应的class。Action标签里有一个一个method属性,他可以指定执行action中的哪个方法

下面我们就开始以登录为例来写一下struts2开发的视图层:

Login.jsp

[html] view plaincopyprint?

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

  2. <%

  3. String path = request.getContextPath();

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

  5. %>

  6. <html>

  7. <head>

  8. </head>

  9. <body>

  10. <form action="LoginAction.action">

  11. <input type="text" name="username"/><br/>

  12. <input type="password" name="password"/><br/>

  13. <input type="submit" value="提交"/>

  14. </form>

  15. </body>

  16. </html>

好了,视图层写完了,下面就要开始写核心action了,由于业务逻辑层就是判断用户名和密码是否与固定的admin和123456相等,所以本程序只是为了测试,就不再单独抽出来了,直接写在action里面了LoginAction.java

[java] view plaincopyprint?

  1. package com.bzu.action;

  2. public class LoginAction {

  3. private String username;

  4. private String password;

  5. public String getUsername() {

  6. return username;

  7. }

  8. public void setUsername(String username) {

  9. this.username = username;

  10. }

  11. public String getPassword() {

  12. return password;

  13. }

  14. public void setPassword(String password) {

  15. this.password = password;

  16. }

  17. public String execute(){

  18. if(username.equals("admin")&&password.equals("123456"))

  19. return "success";

  20. return "fail";

  21. }

  22. }

从上面的程序可以看出,我们在action中要把form表单中数据都以私有变量的形式定义出来,然后在提供对应的set和get方法。很多同学可能在这又有疑问了。为什么给他提供set和get方法,form表单中的数据就可以设置到对应的属性上呢?为什么他会默认的去执行execute方法呢?为什么把配置文件中action标签对应的method属性修改后就可以执行新设置的方法呢?呵呵,在这在卖个关子,在接下来的博客中,会为大家一一把这些疑问解决。

Action写完之后,我们就可以把struts.xml对应的写上了,本程序完整的struts.xml:

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE struts PUBLIC

  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

  4. "http://struts.apache.org/dtds/struts-2.0.dtd">

  5. <struts>

  6. <constant name="struts.i18n.encoding" value="utf-8" />

  7. <package name="struts2" extends="struts-default">

  8. <action name="LoginAction" class="com.bzu.action.LoginAction">

  9. <result name="success">success.jsp</result>

  10. <result name="fail">fail.jsp</result>

  11. </action>

  12. </package>

  13. </struts>

对应的success.jsp和fai.jsp没什么内容,就是显示成功和失败几个字。

好了,到此,我们的第一个struts2的应用程序就写完了,下面我们一起来看一下运行结果:

————》

开发一个struts2的实例的更多相关文章

  1. 一个Struts2的实例

    对Web应用程序而言,需要跨越HTTP协议的两个障碍——无状态和基于文本. 在没有使用struts的时候,你会有一个很真切的体会,就是如何把html页面上的数据提交给后台处理,以什么格式提交? 这是个 ...

  2. 第一个Struts2实例之hello world!

    Struts官网:http://struts.apache.org/ Struts2框架预先实现了一些功能    1:请求数据自动封装    2:文件上传的功能    3:对国际化功能的简化    4 ...

  3. 学习 WebService 第三步:一个简单的实例(RAD+WAS 8.5开发SOAP项目)

    [开发环境] Web Service 服务器端开发工具:RAD(Eclipse内核) Web Service 服务器:IBM WebSphere v8.5 REST/SOAP:SOAP(JAX-WS/ ...

  4. [MEF插件式开发] 一个简单的例子

    偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...

  5. 开发一个jQuery插件——多级联动菜单

    引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...

  6. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

    [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...

  7. 使用Symfony 2在三小时内开发一个寻人平台

    简介 Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快.性能高等特点.但Symfony2的学习曲线也比 较陡峭,没有经验的初学者往往需要一些练习才能掌握其特性. 本文通过一个快速开 ...

  8. 开发一个完整的JavaScript组件

    作为一名开发者,大家应该都知道在浏览器中存在一些内置的控件:Alert,Confirm等,但是这些控件通常根据浏览器产商的不同而形态各异,视觉效果往往达不到UI设计师的要求.更重要的是,这类内置控件的 ...

  9. Python之路,Day18 - 开发一个WEB聊天来撩妹吧

    Python之路,Day18 - 开发一个WEB聊天来撩妹吧   本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个 ...

随机推荐

  1. SQL Server 中的三种分页方式

    USE tempdb GO SET NOCOUNT ON --创建表结构 IF OBJECT_ID(N'ClassB', N'U') IS NOT NULL DROP TABLE ClassB GO ...

  2. 【转】使用JavaScriptCore在JS和OC间通信

    http://www.cocoachina.com/ios/20160623/16796.html iOS 开发中,我们时不时的需要加载一些 Web 页面,一些需求使用 Web 页面来实现可以更可控, ...

  3. Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)

    题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...

  4. 关于三目运算符与if语句的效率与洛谷P2704题解

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  5. IoC模式(Inversion of Control)

      1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它.下面看 ...

  6. DX相机变换矩阵推导

    网上很多的推导过程都是错的,所以写一个. 先平移,再旋转就可以,先平移的原因是,如果先旋转的话,坐标系已经改了,所以先平移. 平移的变换和相机的变换是相反的,所以是: 平移完成后,相机的位置就和原点的 ...

  7. cocos2d 制作动态光晕效果基础 —— blendFunc

    转自:http://blog.csdn.net/yang3wei/article/details/7795764 最近的项目要求动态光晕的效果. 何谓动态光晕?之前不知道别人怎么称呼这个效果, 不过在 ...

  8. wsus客户端/服务器检查更新

    wuauclt /detectnow 客户端检查更新 Wuauclt.exe是Windows自动升级管理程序.该进程会不断在线检测更新 wsusutil.exe wsus服务器命令行工具

  9. Struts 2.x异常:Unable to load configuration..../WEB-INF/lib/struts2-convention-plugin-2.1.6.jar!/struts-plugin.xml:30:119

    Struts 2.x异常:Unable to load configuration..../WEB-INF/lib/struts2-convention-plugin-2.1.6.jar!/strut ...

  10. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...