Struts2的第一个案例

首先我们需要引入架包

entity:

package cn.happy.entity;
/**
* Entity Object
* @author Happy
*
*/
public class UserInfo {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} }

  

然后我们书写LoginAction.java

package cn.happy.action;

import java.util.Map;

import javax.security.auth.message.config.ServerAuthContext;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext;
import org.omg.PortableServer.ServantActivator; import cn.happy.entity.UserInfo; import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven; public class LoginAction implements Action,ModelDriven<UserInfo>{
//前台输入的用户名和密码 在Action中如何捕获
private UserInfo user=new UserInfo();
public String execute() throws Exception {
System.out.println("====LoginAction ==============+++execute");
System.out.println("================="+user);
if (user.getName().equals("admin")&&user.getPwd().equals("admin")) {
//解耦
/*Map<String, Object> session = ActionContext.getContext().getSession();
session.put("name", user.getName());*/
//耦合
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("user",user.getName());
return "success";
}else {
return "login";
}
}
public UserInfo getUser() {
return user;
}
public void setUser(UserInfo user) {
this.user = user;
}
public UserInfo getModel() {
return user;
} }

  

着这个类中我们用到了二个接口

一,Action

public abstract interface com.opensymphony.xwork2.Action {
  public static final java.lang.String SUCCESS = "success";
  public static final java.lang.String NONE = "none";
  public static final java.lang.String ERROR = "error";
  public static final java.lang.String INPUT = "input";
  public static final java.lang.String LOGIN = "login";
  public abstract java.lang.String execute() throws java.lang.Exception;
}

这个方法只有一个方法: execute()和一些有用的String常量

  这些方法可以很方便地作execute()方法返回的控制字符串的值。真正的好处是框架内部也使用了这些常亮。这意味着使用这些预定的控制字符串允许你接入更多的智能默认的行为。

  在这里我们先不做过深的讨论!

二、ModelDriven<T>

  ModelDriven让你可以直接操作应用程序中的领域对象(模型对象),允许你在Web层和业务逻辑层使用相同的对象。

  ModelDriven接口中只有一个方法,其方法的原型如下:

public abstract interface com.opensymphony.xwork2.ModelDriven {
  public abstract java.lang.Object getModel();
}

该方法返回一个用于接收用户输入数据的模型对象

public UserInfo getModel() {
return user;
}

  

然后我们就需要去配置struts.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>
<!--
constant:常量
devMoode;开发模式:true: 我在Struts。xml文件中做了修改,tomcat不需要重启
-->
<constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default">
<action name="loginAction" class="cn.happy.action.LoginAction">
<result name="success">/login/success.jsp</result>
<result name="login">/login/login.jsp</result>
</action>
</package>
</struts>

2、extends属性的详解

  • 当一个包通过配置extends属性继承了另一个包的时候,该包将会继承父包中所有的配置,包括action、result、interceptor等。
  • 由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。
  • 通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中内置的包。

3、namespace的详解

namespace主要是针对大型项目中Action的管理,更重要的是解决Action重名问题,因为不在同一个命名空间的Action可以使用相同的Action名的

4、<action>与<result>

1、<action>属性介绍

属性名称

是否必须

功能描述

name 请求的Action名称
class Action处理类对应具体路径
method 指定Action中的方法名
converter 指定Action使用的类型转换器

如果没有指定method则默认执行Action中的execute方法。

2、<result>属性介绍

属性名称

是否必须

功能描述

name 对应Action返回逻辑视图名称,默认为success
type 返回结果类型,默认为dispatcher

3、访问Action方法的另一种实现方式

在Struts2中如果要访问Action中的指定方法,还可以通过改变URL请求来实现,将原本的“Action名称.action”改为“Action名称!方法名称.action”在struts.xml中就不需要指定方法名了。

5、<exception-mapping>与<global-exception-mapping>

这两个标签都是用来配置发生异常时对应的视图信息的,只不过一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.这两个标签包含的属性也是一样的:

属性名称

是否必须

功能描述

name 用来表示该异常配置信息
result 指定发生异常时显示的视图信息,这里要配置为逻辑视图
exception 指定异常类型

在对struts.xml文件进行一个详细的分解后,我们该配置最后一道wed.xml了。

<?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">
<display-name></display-name> <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> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

  这个没什么好说的,然后就是jsp页面

login

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
</head> <body>
<s:form name="form1" namespace="/" method="post" action="loginAction">
请输入用户名: <s:textfield name="name"></s:textfield> <br/>
<s:textfield name="pwd"></s:textfield><br/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>

success

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
</head>
<body>
成功页面!</br>
欢迎您:${name}!
</body>
</html>

  接下来是运行结果:

在用户名和密码输入都正确的情况下将会跳到success.jsp页面:

谢谢观看!!!!!!!!!!!!!!!!!!!!!!!!!!

Strust2初之体验的更多相关文章

  1. Strust2 初体验

    Struts2的第一个案例 首先我们需要引入架包 entity: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package ...

  2. Git/GitHub 初用体验与总结

    Git,一个神奇而又陌生的东西,居然到现在才去了解它,就像有一位仁兄说的,现在不会用Git真的都不好意思说自己搞IT的. 简单的讲,这Git是目前最先进的分布式版本控制系统,和他相对应的就是众所周知的 ...

  3. Android 5.0 Lollipop初上手体验

    在等了好几天还没有等到OTA升级提示,前天笔者给Nexus4线刷入了官方提供的Lollipop的镜像,在试用了这两天之后,现在总结下自己感觉很惊艳的地方和一些地方的吐槽.(点击图片可以查看大图) 1. ...

  4. 树莓派 Zero WH 初使用体验

    12号买了一个树莓派 Zero WH,这个是什么型号呢?其实和树莓派Zero是同一系列的,加上W则表示多了无线Wifi和蓝牙模块,加上H则表示在板子上已经焊接好了2x20的排针. 这个Zero真的很迷 ...

  5. quartz之hello(java)

    quartz    任务调度框架 简单的说:就是在特定的时间,干指定的事件,然后具体到某个对象去做 quartz初之体验: 1.pom.xml文件(导入jar包) <dependencies&g ...

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

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

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

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

  8. Spring之初体验

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

  9. Xamarin.iOS开发初体验

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

随机推荐

  1. Unity3D 5.x 简单实例 - 脚本编写

    1,Vector3 类型变量存储向量坐标值 Vector3.forward Vector3(0,0,1) Vector3.up Vector3(0,1,0) Vector3.right Vector3 ...

  2. 【转】php pdo连接数据库 解决中文乱码问题(wordpress mysql 问号?? ??)

    原文链接:http://blog.csdn.net/ysydao/article/details/11002295 PHP 用pdo连接数据库时出现中文乱码问题解决办法 1.array(PDO::MY ...

  3. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  4. 【圣诞呈献】高性能 Socket 组件 HP-Socket v3.1.1 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  5. lable计算行高

    _introduce.text=status.introduce; //设置行间距 NSMutableAttributedString *attributedString = [[NSMutableA ...

  6. 课程上线 -“新手入门 : Windows Phone 8.1 开发”

    经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...

  7. SELECT CAST(GETDATE() AS VARCHAR(10)) 显示不同格式的原因

    开发人员测试时,发现生产服务器与测试服务器执行SELECT CAST(GETDATE() AS VARCHAR(10))语句显示的格式不一样.如下所示 Server A Server B 其实出现这个 ...

  8. [AlwaysOn Availability Groups]排查:AG超过RTO

    排查:AG超过RTO 自动故障转移或者手动转移之后,没有数据都是,你可能会发现切换时间超过了你的RTO.或者当你评估切换时间同步提交secondary副本,发现超过了你的RTO. 1. 通常原因 通常 ...

  9. 分布式架构中一致性解决方案——Zookeeper集群搭建

    当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...

  10. 特定IP访问远程桌面

    1. 新建IP安全策略 (远程端口没有修改情况下的设置) WIN+R打开运行对话框,输入“gpedit.msc”进入组策略编辑器. 依次打开:本地计算机策略--计算机配置--Windows设置--安全 ...