您的位置:首页 > 编程语言 > Java开发

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

2017-07-24 11:34 267 查看

一、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-INF目录下新建一个web.xml文件,这是整个web工程的配置文件,之前的eclipse新建web项目的时候会自动生成,如果没有自动生成,我们需要手动添加。



接下来当然是导包,我们要使用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">/e
d31d
rror.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路径和选择你自己的版本,运行即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts s2sh web框架