通过初识SSH我们已经从宏观的角度对SSH有一个了解,接下来将会逐步的对立面的内容进行深入学习.首先是需要学习的是Struts框架.
在上篇文章中我们提到:Struts就是一个MVC的架构,在控制器,视图和模型方面都有其特定的组件,更多的是利用了Controller这个组件。
接下来将通过一个简单的登录例子来学习Struts框架,并了解它这个框架的主要流程.由于是第一个例子会详细的将里面的一些内容都描述出来.
配置struts环境(只能应用于WEB项目)
下载struts资源包
struts-1.2.9
拷贝struts相关的jar包拷贝到项目中的WEB-INF/lib目录下
配置ActionServlet在web.xml文件中.因为这次初次配置,所以很多的配置信息需要参考struts资源包中的例子struts-1.2.9-bin\webapps\struts-examples.war.
参照例子项目,<<struts-examples.war>>
将以后的xml中的关于servlet的配置拷贝到自己的项目中具体内容如下代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- Standard Action Servlet Configuration (with debugging) -->
<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>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
配置struts-config.xml,将例子中的此文件拷贝到WEB-INF文件目录下
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>
</struts-config>
- 创建登录页面
- 创建一个登录(login.jsp)
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
<from action="" method="post">
用户名:<input type="text" name="username"><br/>
密码: <input type="text" name="password"/>
<input type ="submit" name="login"/>
</from>
</body>
</html>
- 一个登录失败页面(login_failure.jsp)
package com.bjpowernode.struts;
import org.apache.struts.action.ActionForm;
/**
* 登录ActionFrom ,负责表单数据的搜集
* @author jnqqls
* @group TGB
* @version 1.0
* @comments
*/
@SuppressWarnings("serial")
public class LoginActionForm extends ActionForm {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 创建LoginAction(需要继承struts1的Action)
- 需要覆盖exectute方法
package com.bjpowernode.struts;
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;
/**
* 登录Action
* 负责获取表单数据,调用业务逻辑,返回转向信息
* @author jnqqls
* @group TGB
* @version 1.0
* @comments
*/
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//转换为LoginActionForm类型
LoginActionForm laf=(LoginActionForm)form;
//获取form中的数据
String username=laf.getUsername();
String password=laf.getPassword();
//这里仅仅是测试,不进行数据库判断.
if("admin".equals(username) && "admin".equals(password)){
//登录成功
//mapping 代表配置信息
return mapping.findForward("success");
}else{
//登录失败
return mapping.findForward("failure");
}
}
- 配置到struts-config配置文件中
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>
<form-beans>
<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
</form-beans>
<action-mappings>
<action path="/login"
type="com.bjpowernode.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"/>
<forward name="failure" path="/login_failure.jsp"></forward>
</action>
</action-mappings>
</struts-config>
至此整个Struts登录的例子完成,可以进行相关的页面测试.接下来将对整个流程做一个解释,而在Struts中,流程的理解是非常重要的一个部分,需要深入的去学习.真个例子的流程如下.
Web客户端请求Tomcat通过request(username,password);/login.do 从Tomcat中找到ActionServlet,此Servlet在Tomcat启动的时候已经实例化完成. 调用ActionServlet的doGet/doPost方法. ActionServlet调用RequestProcesser(核心类) RequestProcesser调用processPath方法,用于截取URL. RequestProcesser调用processMapping,作用是根据截取的URL取得ActionMapping. RequestProcesser调用processActionForm 根据ActionMapping中的name查找ActionForm 如果配置了ActionFrom,那么就到request或者session查找 如果在request或者session中 存在已经创建的ActionForm,那么将会返回. 如果不存在那么根据ActionFrom完整路径采用反射进行创建. 再将创建好的ActionFrom放到request或者session中. RequestProcesser调用processPopulate方法 首先执行ActionForm中的reset方法进行重置. 随后得到表单中所有输入域的name名称. 之后在调用request.getParameterValues(),根据name名称得到相应的值. 最后把表单中的数据全部放到一个map中. map的key为表单输入域的名称,map的value为表单的输入域的值(字符串数组). 接下来调用一个第三方组件,BeanUtils,将Map中的值根据ActionForm中类型先转换好再设置到ActionFrom上.再调用ActionFrom中的setter方法设置到ActionFrom上. processActionCreate先根据Action的完整类名称到Map中查找,如果存在就返回Action对象,否则根据Action类的完整名称采用反射机制去创建,再将创建好的Action放入Map中,所以Struts1的Action是单实例的,存在线程安全问题.
processActionForm执行用户自定义Action中的execute方法,将ActionMapping,ActionFrom,request,response传递过去,将ActionForward传递过去.
processForwardConfig根据返回的ActionForward完成转向或转发.
通过整个流程我们发现,在Struts中RequestProcesser是一个比较核心的方法.同时也涉及到很多的对象,例如ActionFrom,ActionMapping.等等
小结:通过以上的流程,希望读者能够对Struts流程有一个基本的了解.它是一个基于Sun J2EE平台的MVC框架,从代码中可以看出它主要是采用Servlet和JSP技术来实现的。Struts能充分满足应用开发的需求,简单易用,敏捷迅速,把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,我们利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。它的官方地址是http://struts.apache.org "闲来无事"可以多浏览一下.