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

来源:互联网 发布:cms整站系统 编辑:程序博客网 时间:2024/06/04 20:12

一、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)。
    新建的web工程

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

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

  • 导入依赖包之后,一定是要使用它,使用的时候需要给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.
    这里写图片描述

  • 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路径和选择你自己的版本,运行即可。