一:什么是struts2?

Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点

Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性

二:struts2的项目结构

apps目录:Struts2示例应用程序

docs目录:Struts2指南、向导、API文档

lib目录:Struts 2的发行包及其依赖包

src目录:Struts 2项目源代码

步骤一:配置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>
<!-- 拦截所有的action -->
<url-pattern>/*</url-pattern>
</filter-mapping>

步骤二:在src目录下创建struts2.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- 配置文件中只要添加以下配置,那么以后修改配置文件不用重启tomcat -->
<constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default">
<!-- 第一个action的例子 -->
<action name="helloWorld" class="cn.happy.action.HelloWorldAction">
<result name="success">
index.jsp
</result>
</action>
<!-- 登陆的action -->
</package>
<!-- Add packages here -->
</struts>

步骤三:编写Action类

package cn.happy.action;

import com.opensymphony.xwork2.Action;

public class HelloWorldAction implements Action{
private String name ;
private String message;
public String execute() throws Exception {
setMessage("Hello"+getName());
return "success";
}
}

步骤四:创建index.jsp页面

<div>
<h1>
<!--显示Struts Action中message的属性内容-->
<s:property value="message"/>
</h1>
</div>
<div>
<form action="helloWorld.action" method="post">
请输入您的姓名:
<input name="name" type="text" />
<input type="submit" value="提交" />
</form>
</div>

步骤五:使用浏览器访问

运行结果

案例二:

实现登陆案例

步骤一:在src目录下创建struts2.xml配置文件,如下:

<struts>
<!-- 修改该文件,tomcat不用重启 -->
<constant name="struts.devMode" value="true"/>
<package name="default" namespace="/" extends="struts-default">
<action name="HelloWorldAction" class="cn.action.HelloWorldAction">
<result name="success">/success.jsp</result>
<result name="login">/error.jsp</result>
</action>
</package>
</struts>

步骤二:创建Action类

注意:在此需要校验从前台传递过来的用户名和密码,所以我们需要在Auction类中植入两个属性,但如果当属性过多时我们就可以将这些属性封装成为实体类,在Action类中引用它们。

1.1创建实体类UserInfo

package entity;
public class UserInfo {
private String username;
private String userpwd;
public String getUsername() {
return username;
}
public String getUserpwd() {
return userpwd;
}
public void setUsername(String username) {
this.username = username;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
} }

1.2

创建的Action类加多实现一个接口:ModelDriven<T>,并且重写该接口的抽象方法!

package cn.action;

import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven; import entity.UserInfo; public class HelloWorldAction implements Action,ModelDriven<UserInfo> {
private UserInfo users=new UserInfo();
@Override
public String execute() throws Exception { /*Map<String, Object> session = ActionContext.getContext().getSession();
session.put("username", users.getUsername());*/
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("username", users.getUsername());
if(users.getUsername().equals("admin")&&users.getUserpwd().equals("admin"))
{
return "success";
}
else
{
return "login";
}
}
@Override
public UserInfo getModel() {
// TODO Auto-generated method stub
return users;
}
}

步骤三:获取session

方式:耦合

解藕

1.1耦合方式:

方式一:

HttpSession session2 = ServletActionContext.getRequest().getSession()

方式二:

1.2解耦方式

方式一:

Map<String, Object> session = ActionContext.getContext().getSession();

返回值是一个Map集合,我们回想下当初我们学习servlet时,如何向session的作用域中存放数据?

request.getSession().setAttribute(string,Object);

怎么样,眼熟吧!不解释

方式二:

使用struts2提供的SessionAware接口为我们自动装配出来一个Map集合,使用同上!

那么问题来了?这两种方式有什么不同吗?

解耦方式:

为了避免与Servlet API耦合在一起,方便Action类做单元测试,
  Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,
  构造了三个Map对象来替代这三种对象,在Action中,
  直接使用HttpServletRequest、HttpSession、ServletContext对应的Map对象来保存和读取数据。
  要获得这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类

耦合方式:

直接访问 Servlet API将使Action类与Servlet API耦合在一起,Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,测试过程中就必须有Servlet容器,这样不便于Action类的测试,但有时候,确实需要访问这些对象,Struts2同样提供了直接访问ServletAPI对象的方式。

要直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。

步骤三:创建登陆界面

 <s:form name="form1" namespace="/" method="post" action="login">
请输入用户名: <s:textfield name="username"></s:textfield> <br/>
<s:textfield name="password"></s:textfield><br/>
<s:submit value="登陆"></s:submit>
</s:form>

struts2初体验的更多相关文章

  1. Struts2 初体验

    Sturts是一款优雅的,可扩展性很强的框架.它是由Struts开发团队和WebWord团队合作,共同开发的一个新的产品.新版本的Struts2 更加容易使用,更加接近Struts所追求的理念.从开发 ...

  2. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  3. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  4. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  5. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  6. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  7. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  8. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  9. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

随机推荐

  1. linux 压缩命令详解

    原文地址:http://www.2cto.com/os/201112/114982.html 编写shell脚本的时候经常需要解压缩到指定的文件夹,tar命令是最常用的 参考一下说明,其中注意-C的用 ...

  2. 微信公众号里打开链接下载APP

    嵌入这样的代码 <a href="http://a.app.qq.com/o/simple.jsp?pkgname=com.violationquery" target=&q ...

  3. Android 网络图片查看器

    今天来实现一下android下的一款简单的网络图片查看器 界面如下: 代码如下: <LinearLayout xmlns:android="http://schemas.android ...

  4. mysql java Cannot find the driver in the classpath!

    确保你的mysql-connector-java有没有配置好, 如何配置: 从oracle上把mysql-connector-java下下来放到java_home里面的extensions里面,然后在 ...

  5. 软件光栅化渲染器Augustus计划

    在看完Real-Time Rendering后,我决定动手实现一个软件的光栅化渲染器.我就称它为Augustus计划吧. 计划使用MFC和GDI+来做它的UI.可以访问GitHub来查看它的源代码.

  6. Unbuntu_14.04编译openjdk7

    今天有问题需要研究一下JVM,但系统挂了,只能重装.在ubuntu下再次编译JDK,大约2个半小时,将遇到的问题笔记整理一下. 1.下载Openjdk Source Code 我用的是http://d ...

  7. BIEE使用技巧

    索引: 1.如何清除缓存 2.通过“编辑 SQL”取得前一天的日期 3.格式化日历框参数 4.根据传入的开始时间和结束时间取得事实表中的指标(用到了3中的技巧) 5.直接调用数据库函数 6.时间格式转 ...

  8. Tomcat源码解读:ClassLoader的设计

    Tomcat是一个经典的web server,学习tomcat的源码对于我们是有很大的帮助的.前一段时间了解了tomcat的工作的大致流程,对我的新工作有了很大的帮助.刚学习了ClassLoader( ...

  9. Sql Server之旅——第二站 理解万恶的表扫描

    很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转...这个着急也只有当事人才 明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该 ...

  10. Javascript之旅——第六站:看看writable特性

    说起js中的那些特性标记,总觉得有些怪怪的,那为什么要说到这个attribute,起源于对一个问题的疑问,我们都知道window对象其实就是 浏览器窗口的一个实例,既然是一个实例,那这个实例就应该有“ ...