0.前言
其实我之前学过Struts2的基本使用使用方法,大致上就是导入相应的Struts包,建立映射关系,然后请求跳转。今天学习的Struts更加的细致,虽然和Struts2比起来稍微麻烦了一点,但是可以更加清楚的看到整个流程是怎么运作的,Struts作为框架在底层为开发者做了哪些工作。
本文用的是Struts1.2的Jar包,这里去下载
https://pan.baidu.com/s/1p03nyXDxf7PMQyyLPERxZA
1.为什么要使用Struts框架
MVC的设计思想非常的好,但是不同的开发者基于MVC设计模式写出的代码都不同,这在团队协作和分工、后期修改等方面都造成了许多不便。Struts框架有其一定的规范性——建立映射关系,表单的发送与结果打包,结果跳转。这种规范化的操作对上述提到的问题有着很好的效果。
需要导入七个包(如果只有六个的话,struts-config.xml需要自己建立)
同时需要在tomcat的lib文件夹下复制这几个jar包
2.Struts基本思路
JSP表单内容首先提交给ActionServlet,ActionServlet把信息打包在ActionForm中,ActionForm里面,会调用JavaBean存储好结果,最后跳转到结果页面。
要编写的内容有:JSP、ActionForm、Action、配置文件、JavaBean
还看不太懂这个图,但是以后还是会经常用到的
题目:开发一个界面,输入学生的模糊信息,点击确定后,可以输出学生的个人详细信息。
初始化配置文件struts-config.xml和web.xml
struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans />
<global-exception />
<global-forwards />
<acntion-mappings />
<message-resources parameter="JavaWeb2.ApplicationResources" />
</struts-config>
这里的JavaWeb2.ApplicationResources,JavaWeb2是我web项目的名称。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
queryForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息查询表单</title>
</head>
<body>
查询表单<br>
<form action="???" method="get">
请输入学生姓名:
<input name="sname">
<input type="submit" value="模糊查询">
</form>
</body>
</html>
按照上述Struts开发的流程,这里表单提交的对象应该是ActionServlet,ActionServlet在把信息打包到ActionForm中,所以接下来需要编写ActionForm
QueryForm.java:
package Action;
//ActionForm容纳表单提交的值
//规范:
//1.必须继承org.apache.struts.action.ActionForm
//2.必须编写和表单同名的属性(例如sname)
//3.在配置文件中注册
import org.apache.struts.action.ActionForm;
public class QueryForm extends ActionForm{
private String sname;
/**
* @return the sname
*/
public String getSname() {
return sname;
}
/**
* @param sname the sname to set
*/
public void setSname(String sname) {
this.sname = sname;
}
}
编写完了去配置,在struts-config.xml中:
<form-beans>
<!-- name:名称(随便) type:类路径 -->
<form-bean name="queryForm" type="Action.QueryForm"></form-bean>
</form-beans>
这里的Action是我的包名,QueryForm是我的类名(DAO和Bean较为简单,这里不贴了)
QueryAction.java:
package Action;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import Dao.StudentDao;
//Action负责接受ActionForm的数据,处理
//1.必须继承org.apache.struts.action.Action
//2.重写execute方法执行业务逻辑(便于自动执行业务逻辑)
public class QueryAction extends Action{
@Override
//ActionForward:封装了跳转目标的路径
//mapping:访问配置文件
//form:传过来的ActionForm对象
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
QueryForm queryForm=(QueryForm)form;
String sname=queryForm.getSname();
sname=new String(sname.getBytes("ISO8859-1"), "utf-8");
StudentDao studenDao=new StudentDao();
ArrayList student=studenDao.getInfo(sname);
request.setAttribute("student", student);
ActionForward af=new ActionForward("/queryResult.jsp");
return af;
}
}
值得一提的是,这里重写的execute是ActionForward类型的,默认使用forward,所以不用担心request的值会丢失。
编写完了去配置,在struts-config.xml中:
<acntion-mappings>
<!-- type:类路径,name:相应的ActionForm名称,path:客户端提交到服务器时指定的路径 -->
<action name="queryForm" path="/query" type="Action.QueryAction">
</action>
</acntion-mappings>
这里决定了jsp提交表单的路径,所以可以在前面的queryForm.jsp的action里面补上:
<form action="/Action/query.do" method="get">
这里的Action是我QueryAction所在的包名
queryResult.jsp:
<%@page import="java.util.ArrayList"%>
<%@page import="Bean.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
显示结果
<%
ArrayList student=(ArrayList)request.getAttribute("student");
%>
<table bgcolor="#ff80ff">
<tr>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
</tr>
<%
for(int i=0;i<student.size();i++){
Student student2=(Student)student.get(i);
%>
<tr>
<td><%=student2.getName()%></td>
<td><%=student2.getSex()%></td>
<td><%=student2.getAge()%></td>
<td></td>
</tr>
<%
}
%>
</table>
</body>
</html>
3. 流程处理
在jsp中,表单会根据/Action/query.do,先提交到ActionServlet,ActionServlet是Struts的核心组件,可以读取strust-config.xml配置文件,ActionServlet根据action里面的“/query.do”,先去掉“.do",,然后在配置文件里面找到:
<action name="queryForm" path="/query" type="Action.QueryAction">
path里面的/query,找到了path之后去找name,这里name和上面的
<form-bean name="queryForm" type="Action.QueryForm"></form-bean>
name是一样的,所以来到了这里,找到type,把内容打包到QueryForm里面,又根据path找到QueryAction,把打包的内容交给QueryAction。
这就是完整的流程。
struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<!-- 在此注册ActionForm -->
<form-beans>
<!-- name:名称 type:类路径 -->
<form-bean name="queryForm" type="Action.QueryForm"></form-bean>
</form-beans>
<global-exceptions />
<!-- 设置URL逻辑名称(全局,任意的Action都可以识别到)-->
<global-forwards>
<forward name="RESULT" path="/queryResult.jsp"></forward>
</global-forwards>
<!-- 注册Action -->
<action-mappings>
<!-- type:类路径; name:相应的ActionForm的名称; path:客户端提交到服务器端时指定的路径 -->
<action name="queryForm" path="/query" type="Action.QueryAction">
<!-- 设置URL逻辑名称(局部,只有这个Action可以识别到)-->
<forward name="RESULT" path="/queryResult.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="Action.ApplicationResources" />
</struts-config>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
4.小结
struts的规范化操作,让打包成为一个固定的环节,在日后需要修改打包的内容时,修改会十分方便(比如输入学生的学号进行查询),将开发流程模块化,利于分工合作,代码出现问题时修改起来也快。而且它通过配置文件进行联系,耦合度非常的低,代码和代码之间几乎没什么联系,全靠xml文件。Struts框架还帮助开发者自动完成了许多工作,比如打包,业务逻辑,结果跳转等等,虽然他的年龄很大了,而我还是个小孩子,但是Struts是基于MVC的开发框架的优秀产品,对于Java高级框架的入门和理解是一个很好的实例。