Struts2初体验

来源:互联网 发布:有一个外国女朋友 知乎 编辑:程序博客网 时间:2024/05/22 00:19

Struts2简介:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
Struts 2是在WebWork2基础发展而来的。

注意:struts 2和struts 1在代码风格上几乎不一样。

Struts 2 相比Struts 1的优点:

1、在软件设计上Struts 2 没有像Struts 1那样跟Servlet API 和 struts API 有着紧密的耦合。Struts 2的应用可以不依赖于Servlet API和Struts API 。
2、Struts 2 提供了拦截器,利用拦截器可以进行AOP编程。
3、Struts 2 提供了类型转换器。
4、Struts 2 提供支持多种表现层技术,如:JSP 、 freeMarker等。
5、Struts 2 的输入校验可以指定方法进行校验。
6、Struts 2 提供了全局范围、包范围和Action范围的国际化资源文件管理实现。

Struts 2 体系结构 :
1、Web浏览器请求一个资源。
2、过滤器Dispatcher查找方法,确定适当的Action。
3、拦截器自动对请求应用通用功能,如验证和文件上传操作。
4、Action的execute方法通常用来存储和重新获得信息。
5、结果被返回到浏览器。

使用Struts 2 开发程序的基本步骤

搭建Struts 2 开发环境
1、找到开发Struts 2的应用需要用到的jar包。
2、编写Struts 2的配置文件。
3、在web.xml中加入Struts 2 MVC启动框架配置。

开发Struts 2 最少用到的jar文件:

  Struts-core-2.x.x.jar : Struts 2 框架的核心类库

  xwork-2.x.x.jar : XWork类库,Struts 2 在其上构建

  ognl-2.6.x.jar : Object Graph Navigation Language , Struts 2 框架通过其读写对象的属性。

  freemarker-2.3.x.jar : Struts 2 的UI标签的模版使用 Freemarker编写。

  commons-logging-1.1.x.jar : ASF出品的日志包。

  commons-fileupload-1.2.1.jar : 文件上传组件。
  
  struts2-dojo-plugin-2.3.4.jar:为struts所提供的一些控件例如:日历

Struts2中各种配置文件详解

1、struts.xml文件

struts.xml文件直接新建在src目录下,那样部署的时候会自动发布到WEB-INF/classes目录下,或者直接创建在WEB-INF/classes目录下面。
struts.xml是 Struts 2 的核心配置文件,主要用于配置开发人员编写的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><!--         package:包        name:包名,唯一的,必选项        namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是“/”        extends:继承            extends=“struts-default”:struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件            为什么要继承这个struts-default.xml文件                因为struts框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈。                我们知道struts2框架运行时执行struts-default.xml中的拦截器栈完成必要功能。                如果不继承struts-default.xml文件,就没有办法使用struts2提供的所有拦截器。     --><!-- 所有的Action定义都应该放在package下 -->    <package name="包名" extends="struts-default">     <!--              action:            name:对应页面请求链接的后面半部分            class:对应要执行的类的完整路径        -->        <action name="login" class="LoginAction">         <!--             result:结果类型                name:对应的是执行的类的方法的返回值                 后半部分文本内容:转向的页面            -->            <result name="error">/error.jsp</result><!-- 账户密码错误跳转登录页面重新输入 -->            <result name="success">/welcome.jsp</result><!-- 账户密码正确跳转此页面 -->        </action>    </package></struts> 

2、web.xml文件
在Struts 2中,Struts框架是通过Filter启动的,他在web.xml中的配置如下:

<!-- 配置Struts2 核心 Filter -->  <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>

 在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。

  注意:struts 2 读取到 struts.xml的内容后,以javabean形式存放在内存中,以后Struts 2对用户的每一次请求处理将使用内存中的数据。

  Filter 过滤器是用户请求和处理程序之间的一层处理程序。它可以对用户请求和处理程序响应的类容进行处理,通常用于权限、编码转换等场合。

视图层页面login.jsp

<%@ 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>登录页面</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>               <h3>登录页面</h3>               <form action="loginAction" method="post" >                   用户名:<input type="text" name="uname"/><br />                   密码:   <input type="password" name="upassword" ><br />                   <input type="submit" value="提交登录" >               </form>  </body></html>

控制层loginAction.java

/** * 控制层 */public class loginAction {    /**      * 此属性用来接收form表单提交过来的值,属性名与form表单中name属性名一致     * 必须生成get,set方法 */    private String uname;    private String upassword;    public String execute(){        if(uname!=null && uname.equals("admin") && upassword.equals("123")){            //进入则代表账号密码输入正确            return "success";        }        return "error";    }    /** JavaBean */    public String getUname() {        return uname;    }    public void setUname(String uname) {        this.uname = uname;    }    public String getUpassword() {        return upassword;    }    public void setUpassword(String upassword) {        this.upassword = upassword;    }}
0 0