Struts2(1)

   使用Struts2完成登录功能

案例一:使用Struts2完成登录功能.
1.1 案例需求
1.1.1   需求概述
CRM系统中需要有登录的功能:
本功能要实现用户的登录,页面如下:


1.1.2   需求分析
    Crm系统使用struts2架构实现web层,web层实现的功能是控制逻辑和视图。
    整体调用流程如下:
    1、用户请求至struts2
    2、struts2调用service
    3、service调用dao
    4、dao持久化数据

1.2 相关知识点
1.2.1   Struts2框架的概述
1.2.1.1 什么是Struts2


Struts2是一个基于MVC设计模式的WEB层框架。
1.2.1.2 Struts2和Struts1区别:
Struts2和Struts1没有任何联系.Struts2内核是webwork的内核.
1.2.1.3 WEB层的框架都会基于前端控制器的模式:

1.2.2   Struts2快速入门:
1.2.2.1 下载Struts2的开发包:
官网: https://struts.apache.org/
1.2.2.2 解压Struts2的开发包:

* apps  :Struts2提供一些案例
* docs  :Struts2开发文档.
* lib   :Struts2的开发的jar包
* src   :Struts2的源码
1.2.2.3 创建一个web工程引入相应jar包:
D:\struts2\struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.jar
1.2.2.4 创建一个页面:放置一个链接.
<h1>Struts2的入门案例</h1>
<a href="${pageContext.request.contextPath }/strutsDemo1.action">访问Struts2的Action.</a>
1.2.2.5 编写一个Action:
public class StrutsDemo1 {

    /**
     * 提供一个默认的执行的方法:execute
     */
    public String execute(){
        System.out.println("StrutsDemo1中的execute执行了...");
        return null;
    }
}
1.2.2.6 完成Action的配置:
在src下引入一个struts.xml

<struts>
    <!-- 配置一个包:package -->
    <package name="demo1" extends="struts-default" namespace="/">
        <!-- 配置Action -->
        <action name="strutsDemo1" class="cn.itcast.struts2.action.StrutsDemo1">

        </action>
    </package>
</struts>
1.2.2.7 配置核心过滤器:
  <!-- 配置Struts2的核心过滤器:前端控制器 -->
  <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>
1.2.2.8 修改Action,将方法设置一个返回值:
public class StrutsDemo1 {

    /**
     * 提供一个默认的执行的方法:execute
     */
    public String execute(){
        System.out.println("StrutsDemo1中的execute执行了...");
        return "success";
    }
}
1.2.2.9 修改struts.xml
<struts>
    <!-- 配置一个包:package -->
    <package name="demo1" extends="struts-default" namespace="/">
        <!-- 配置Action -->
        <action name="strutsDemo1" class="cn.itcast.struts2.action.StrutsDemo1">
            <!-- 配置结果页面的跳转 -->
            <result name="success">/demo1/demo2.jsp</result>
        </action>
    </package>
</struts>
1.2.3   Struts2开发流程分析
1.2.3.1 Struts2的执行流程:
从客户端发送请求过来 先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器 就会完成部分功能代码)执行目标Action,在Action中返回一个结果视图,根据Result的配置进行页面的跳转.


1.2.3.2 配置struts.xml中的提示(在不联网情况下)
DTD存放的路径:src\core\src\main\resources\struts-2.3.dtd
Window--->Preferences--->在左侧搜索xml catalog--->add添加.
* 选择URI
* 文件系统 选择dtd路径



1.2.4   Struts2的常见配置
1.2.4.1 Struts2的配置文件的加载顺序:
查看StrutsPrepareAndExecuteFilter:(核心过滤器)两个功能 :预处理 和 执行 
在预处理功能中 init 方法中会有加载配置文件的代码:
dispatcher.init();
            init_DefaultProperties(); // [1]                    ---- 加载org.apache.struts.default.properties.配置的是struts2的所有常量.
            init_TraditionalXmlConfigurations(); // [2]     ---- 加载struts-default.xml、struts-plugin.xml、struts.xml
            init_LegacyStrutsProperties(); // [3]               ---- 加载用户自定义struts.properties
            init_CustomConfigurationProviders(); // [5]     ---- 加载Struts2定义Bean.
            init_FilterInitParameters() ; // [6]                ---- 加载web.xml
            init_AliasStandardObjects() ; // [7]                ---- 用户自定义Bean

结论:
* default.properties
* struts-default.xml
* struts-plugin.xml
* struts.xml                ---- 配置Action以及常量.(******)
* struts.properties     ---- 配置常量
* web.xml               ---- 配置核心过滤器及常量.

***** 后配置的常量 会 覆盖先配置的常量.
1.2.4.2 Action的配置:
<package>的配置:
* package:包. 不是java中说那个包. Struts2中的包 管理<action>.
* 属性:
* name      :包名.包名是唯一的不能重复的.
* extends   :继承.继承struts-default.(struts-default包中定义结果类型和拦截器.)
* namespace :名称空间.与<action>标签中的name属性共同决定Action的访问路径.
* 写法:
* namespace有名称: namespace=”/aa”
* namespace只是一个/:    namespance=”/”
* namespace默认的: namespace没写.

* abstract  :抽象的.用于使其他的包可以继承的.
* <package name="struts-default" abstract="true"> . 所以可以继承struts-default.

<action>的配置:
* action:配置Action类的访问路径.
* 属性:
* name  :名称.与<package>中的namespace属性共同决定访问路径.
* class :类的全路径.要执行的Action类的全路径.
* method    :方法.用来指定Action中执行那个方法的方法名.(默认的值execute)

<result>的配置:
* result:配置Action执行后的页面跳转.
* 属性:
* name  :逻辑视图名称.(不是真实的视图,为真实的视图起了一个别名,在Action中返回这个字符串的别名,从而找到具体页面.)
* type  :跳转的类型.
1.2.4.3 默认的Action和Action的默认处理类:
默认的Action:
<!-- 配置默认的Action:Action的访问路径不存在的时候,执行一个默认的Action -->
<default-action-ref name="strutsDemo1"/>


Action的默认处理类:
<!-- Action的默认处理类:Action的访问路径配置正确了,但是没有配置class属性. -->
<default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>

1.2.4.4 Struts2常量的配置:
修改常量:
* struts.xml中修改常量(推荐使用)
    <!-- 修改Struts2的常量的值 -->
    <constant name="struts.action.extension" value="abc"/>

* struts.properties修改常量
    struts.action.extension=xxx

* web.xml中修改常量
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
        <param-name>struts.action.extension</param-name>
        <param-value>xyz</param-value>
    </init-param>
  </filter>

1.2.4.5 分模块开发的时候
<include file="cn/itcast/struts2/demo1/struts_demo1.xml"/>  整合其他的struts的配置文件.
1.2.5   Struts2的Action的访问:
1.2.5.1 Action的编写的方式:
【Action的是一个POJO的类】
Action是简单的Java对象没有实现任何借口 和 继承任何类.
public class ActionDemo1 {

    public String execute(){
        System.out.println("ActionDemo1执行了...");
        return null;
    }
}
【Action类实现一个Action的接口】
public class ActionDemo2 implements Action{

    @Override
    public String execute() throws Exception {
        System.out.println("ActionDemo2执行了...");
        return null;
    }

}

Action接口中提供了5个已经定义好的视图名称:
    * SUCCESS       :success,代表成功.
    * NONE          :none,代表页面不跳转
    * ERROR         :error,代表跳转到错误页面.
    * INPUT         :input,数据校验的时候跳转的路径.
    * LOGIN         :login,用来跳转到登录页面.
【Action类继承ActionSupport类】
public class ActionDemo3 extends ActionSupport{

    @Override
    public String execute() throws Exception {
        System.out.println("ActionDemo3执行了...");
        return NONE;
    }
}

ActionSupport中提供了一些功能,比如数据校验,比如国际化… 如果Action继承了ActionSupport,那么Action就会有这些功能.
1.2.5.2 Action的访问:
Action的访问不是难题,因为之前已经访问过了,但是出现一个问题一次请求现在对应一个Action,那么如果请求很多对应很多个Action.现在要处理的问题就是要让一个模块的操作提交到一个Action中。
【解决Action的访问的问题的方式一:通过配置method属性完成】
页面:
<h3>客户的管理</h3>
<a href="${ pageContext.request.contextPath }/saveCustomerAction.action">添加客户</a> <br/>
<a href="${ pageContext.request.contextPath }/updateCustomerAction.action">修改客户</a> <br/>
<a href="${ pageContext.request.contextPath }/deleteCustomerAction.action">删除客户</a> <br/>
<a href="${ pageContext.request.contextPath }/findCustomerAction.action">查询客户</a> <br/>


编写Action:
public class CustomerAction extends ActionSupport{

    public String save(){
        System.out.println("CustomerAction中save方法执行了...");
        return NONE;
    }
    public String update(){
        System.out.println("CustomerAction中update方法执行了...");
        return NONE;
    }
    public String delete(){
        System.out.println("CustomerAction中delete方法执行了...");
        return NONE;
    }
    public String find(){
        System.out.println("CustomerAction中find方法执行了...");
        return NONE;
    }
}

配置Action:
    <package name="demo3" extends="struts-default" namespace="/">
        <action name="saveCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="save"></action>
        <action name="updateCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="update"></action>
        <action name="deleteCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="delete"></action>
        <action name="findCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="find"></action>

    </package>

【解决Action的访问的问题的方式二:通过通配符的配置完成】
第一种解决方案不是很优秀,因为在Action的配置中配置多条.能不能一个Class类只对应一个配置?

页面:
<h3>联系人的管理</h3>
<a href="${ pageContext.request.contextPath }/linkman_save.action">添加联系人</a> <br/>
<a href="${ pageContext.request.contextPath }/linkman_update.action">修改联系人</a> <br/>
<a href="${ pageContext.request.contextPath }/linkman_delete.action">删除联系人</a> <br/>
<a href="${ pageContext.request.contextPath }/linkman_find.action">查询联系人</a> <br/>

编写Action:
public class LinkManAction extends ActionSupport{

    public String save(){
        System.out.println("保存联系人...");
        return NONE;
    }
    public String update(){
        System.out.println("修改联系人...");
        return NONE;
    }
    public String delete(){
        System.out.println("删除联系人...");
        return NONE;
    }
    public String find(){
        System.out.println("查询联系人...");
        return NONE;
    }
}

配置Action:
    <!-- 通配符的配置 -->
    <action name="linkman_*" class="cn.itcast.struts2.demo3.LinkManAction" method="{1}"></action>

【解决Action的访问的问题的方式三:动态方法访问】
开启一个常量:动态方法访问.
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

编写Action:
public class UserAction extends ActionSupport{

    public String save(){
        System.out.println("保存用户...");
        return NONE;
    }
    public String update(){
        System.out.println("修改用户...");
        return NONE;
    }
    public String delete(){
        System.out.println("删除用户...");
        return NONE;
    }
    public String find(){
        System.out.println("查询用户...");
        return NONE;
    }
}

配置Action:
<!-- 动态方法访问的配置 -->
<action name="userAction" class="cn.itcast.struts2.demo3.UserAction"></action>

页面路径写法:
<h3>用户的管理</h3>
<a href="${ pageContext.request.contextPath }/userAction!save.action">添加用户</a> <br/>
<a href="${ pageContext.request.contextPath }/userAction!update.action">修改用户</a> <br/>
<a href="${ pageContext.request.contextPath }/userAction!delete.action">删除用户</a> <br/>
<a href="${ pageContext.request.contextPath }/userAction!find.action">查询用户</a> <br/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值