前言
这一篇主要讲Struts,这是在Servlet之后框架上的一次改变,上一篇文章讲过了Servlet的一些不足之处,因此Struts对原有的方式进行的改善。这里需要指出的是Struts本身可以看做一个Servlet,Servlet是原材料,应用Struts只是给了一个规范使得制作的速度更快,更易维护,这里我们主要讲Struts2的相关内容。
struts的工作流程
Struts中引入了mvc的思想,这个具体体现在各部分的耦合度更低,分工更加明确。在Struts中用户请求首先会被Struts拦截分发器进行拦截,对获取的请求会进行分析,找出想要到达的action,这里的action在Struts中被称为控制器,action的execute方法会被自动执行,开始后台一系列处理操作的入口。在这个方法中我们可能会做很多事情,业务的处理、数据库的操作,这里action只是起到了一个调度作用,不会再这里进行大量逻辑的书写,具体的业务会由相应的业务逻辑模块进行处理。当处理完成后,在execute方法中返回一个标准字符串,在Struts.xml配置文件中会找到字符串的映射页面。下图是Struts的整个处理过程
可以看出Struts是通过拦截器获取用户请求,action作为整个Struts的核心部分,配合struts.xml对请求作出处理和响应。
创建Struts项目
这里我们通过一个登录的小例子来演示Struts的过程。在eclipse中新建Dynamic Web project,在WEB-INF的lib文件夹引入Struts包
并在WEB-INF下建立web.xml文件,文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
创建登录action:LoginAction
package com.struts.example; import com.opensymphony.xwork2.ActionSupport; /** * @author zhaoshaopeng * @version 创建时间:2017年9月7日 上午9:39:25 * 类说明 */ public class LoginAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; public String name; public String password; public String execute() throws Exception { if (name!=null&&password!=null) { return "success"; } return "error"; } }
在Struts2中接收参数可以直接通过在action中定义同名变量来接受,这点需要了解。接下来需要创建struts.xml,在eclipse中需要首先进行配置,这里引用别人的一个配置过程,谢谢作者:
创建好了struts.xml,接来下进行配置,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts" extends="struts-default">
<action name="login" class="com.struts.example.LoginAction">
<result name="success">/success.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>login</title>
</head>
<body>
<form action="login" method="post">
<div><span>姓名:</span><input name="name" type="text" /></div>
<div><span>密码:</span><input name="password" type="text" /></div>
<div><input type="submit"></div>
</form>
</body>
</html>
分析与思考
通过上面的讲述我们可以发现Struts在构建web工程时的好处还是很明显的,首先它改变了Servlet+jsp存在的编程随意风格,使得在整个项目上更加的有条理性,逻辑处理的入口放在了action中,后续的业务逻辑可以扩展出Dao层,Service层等,处理完了逻辑部分后页面的跳转统一放在了struts.xml中处理,这无疑给以后的项目管理提供了更好的方式。
说到Struts更多是和Spring和Hibernate结合在一起的,也称为SSH框架,这些框架的引入无论是从效率还是结构上都对项目构建有很大的提升,其中很重要的一点就是为了降低耦合性,由此可见为了解耦人们想了很多的方式,在后续的框架中我们也会看到为了解耦所做出的改变,这也提醒我们在日常写代码中时刻去注意这个问题。