欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一步一步搭建S2SH框架——Struts2

程序员文章站 2022-07-14 23:42:05
...

一、Struts2是什么?可以干什么?

  • 是什么?
    struts2是一个web框架,它可以拦截web页面发送的http请求并分发给相应的Action处理之后,再将结果页面返回。struts2的工作原理在我的另一篇博客上简单介绍了一下struts2的一些理解
  • 可以干什么?
    我们在使用一个框架之前肯定要知道它的好处在哪。
    1.实现MVC模式(松耦合),方便管理。
    2.拦截器功能,拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
    在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
    3.标签库(可以提高开发效率), struts2的标签不同于HTML5的标签,它是封装好的一种格式,使用struts2标签写好的页面代码需要服务器解析之后发送给浏览器来显示,而HTML标签浏览器就可以解析。但是struts2有很多好用的现成的标签,相比于HTML5来说实现起来比较麻烦的可能用struts2标签简单几行就能实现。(之后的小例子中会介绍标签的使用方法)
    4.使用struts2可以直接在struts.xml(struts2的配置文件)中修改增加你的Action,可以直接了解和管理整个系统的运行流程。

二、搭建Struts2所需的环境

以下工具都需要在电脑上安装好并配置好环境变量,所有的安装过程在网上都能找到教程,只有安装好这些工具,才能实现下边的小例子。
- JDK 1.8.0 (安装完成后需要配置环境变量 Java开发必须)
- eclipse Version: Neon.3 Release (4.6.3RC3)
- Tomcat 7.0
- MySQL 5.7 (数据库)
- Navicat For MySQL(MySQL数据库图形化管理工具,十分好用,推荐使用)

三、实现用户登录的小例子

  • 上述环境装好之后,测试是否跑通,Tomcat在浏览器是否能打开localhost:8080页面;
  • 打开eclipse,新建一个动态的web工程(工程名字自定义即可,其他都可以不选,一路next)。
    一步一步搭建S2SH框架——Struts2

  • 建好之后,在WEB-INF目录下新建一个web.xml文件,这是整个web工程的配置文件,之前的eclipse新建web项目的时候会自动生成,如果没有自动生成,我们需要手动添加。
    一步一步搭建S2SH框架——Struts2

  • 接下来当然是导包,我们要使用struts2框架,就需要导入相应的jar包,这个大家可以在官网下载,我提供一个我自己使用的版本 百度网盘链接: https://pan.baidu.com/s/1hsnBVSC 密码: gpsu。将下载的包全部复制到WEB_INF/lib目录下。(如下图所示)我相信有细心的人会发现,图上的包庇你们下载的多了一个servlet-api.jar,这是jsp页面需要用的HTTP请求依赖包,这个包在tomcat的lib文件夹下,需要拷贝进来。
    一步一步搭建S2SH框架——Struts2

  • 导入依赖包之后,一定是要使用它,使用的时候需要给web项目申明,就需要在web.xml文件中配置struts2,配置过程很简单,web.xml完整代码如下。(我们指定login.jsp为应用首页,也就是说在输入localhost:8080/工程名时,就会直接显示login.jsp页面,这个页面后边会新建以及编写。)配置完成后,系统通过查询web.xml文件就会知道所有的页面请求由struts2处理。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">

   <display-name>Struts 2</display-name>
   <welcome-file-list>
   <!--
   指定应用的首页,可以指定多个,服务器在运行的时候,会按顺序遍历这个列表,找到就显示,如果没有找到,就会显示404错误
   -->
      <welcome-file>login.jsp</welcome-file>
   </welcome-file-list>
   <!-- 下边的配置是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>
</web-app>
  • struts2是怎么处理来自页面的请求的呢?我们通过编写struts.xml(struts的配置文件)来了解具体过程。在WEB-INF目录下新建一个classes文件夹,在该文件夹下新建xml文件,可在上图看到最终结果,命名struts.xml(必须用这个名称),下边给出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>
<!-- package封装不同类型的action,一个package下可以有很多的action-->
    <package name="main" extends="struts-default">
    <!-- action就是具体的处理逻辑,name的值就是jsp页面发送的url的值,class的值是对应的action的实体类的具体路径,method是指执行action中的哪个函数。-->
        <action name="login" class="com.ly.struts2.action.LoginAction" method="execute">
        <!-- result是结果处理,每个action的execute函数的执行结果都是字符串,result就是根据不同的返回字符串来判断执行哪种返回结果,当返回字符串是error时,就返回error.jsp页面。-->
            <result name="error">/error.jsp</result>
            <result name="success">/welcome.jsp</result>          
        </action>
    </package>

</struts>
  • 我们既然设定了网站初始页面为login.jsp,那么我们就在Web-Content(这是默认路径)新建一个login.jsp页面。同样的对于不同的处理结果还要新建error.jsp和welcome.jsp.
    一步一步搭建S2SH框架——Struts2

  • login.jsp的源码(login页面提交表单,由struts.xml中的名字叫login的action处理,名字叫login的action类对应的真实的类的路径是class对应的路径下的类。)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
 <!-- action为login,提交时会根据路径在struts.xml找到与其匹配的action类 -->
    <form action="login" method="post">
                  <!--input里面的name的值必须要和action类里面的私有变量名一致,因为struts2需要根据这个名称来调用setter函数,在提交表单的时候直接将值注入到action类里面 -->
                  user name:<input type="text" name="name"/><br/>
                  password:<input type="password" name="password"/><br/>
        <input type="submit" value="login"/>
    </form>
</body>
</html>
  • welcome.jsp源码
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>welcome</title>
</head>
<body>
<h1>hello</h1>
<!--标签取值法,可以直接提取action中名为name的值 -->
<h2><s:property value="name"/></h2>
<h2><s:property value="password"/></h2>
</body>
</html>
  • error.jsp源码
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>error</title>
</head>
<body>
<h1><s:property value="name"/>, error</h1>
<h2>please try again!</h2>
<a href="login.jsp">back to login pager</a>
</body>
</html>
  • 接下来就可以实现LoginAction的具体逻辑了,src下新建一个包com.ly.struts2.action,在该包下新建一个LoginAction类,该类的代码如下
package com.ly.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    /**
     * 在struts中,Action必须要继承ActionSupport,但是在struts2中可以不继承,因为它支持POJO
     * 下边这个uid可以不要,如果编译器提示你需要的时候可以点击自动生成。
     * 两个私有变量对应的login.jsp表单提交时的两个输入,每个私有变量都必须要有getter和setter函数。
     * getter函数命名方式,get+Name(私有变量第一个字母大写)。setter类似。
     * 当执行action的时候,最先执行的是setter函数,需要将表单提交的数据先注入。
     * execute函数是真正的处理逻辑函数,对应的struts.xml中的action的method属性。必须返回字符串。
     */
    private static final long serialVersionUID = 1L;
    private String name;
    private String password;
    public void setName(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
    public void setPassword(String password)
    {
        this.password=password;
    }
    public String getPassword()
    {
        return password;
    }
    public String execute() throws Exception
    {
        /*
         * 简单的判断登录逻辑,之后会涉及到数据库,验证逻辑就需要访问数据库。
         * 这里的两种返回结果,相对应的在struts.xml中就会有两个result,分别处理两种结果。
         */
        System.out.println(name);
        if(name.equals("LeeSin"))

            {
            System.out.println("compared result"+name.equals("LeeSin"));
                if(password.equals("123"))
                    return "success";
                else 
                    return "error";
            }
        else
            return "error";
    }

}
  • 整个项目就搭建完了,让他跑在tomcat服务器上即可,右键你的工程名->Run As->Run on Server->然后配置一下你的tomcat路径和选择你自己的版本,运行即可。