- 配置struts环境(只能应用于WEB项目)
通过初识SSH我们已经从宏观的角度对SSH有一个了解,接下来将会逐步的对立面的内容进行深入学习.首先是需要学习的是Struts框架.
在上篇文章中我们提到:Struts就是一个MVC的架构,在控制器,视图和模型方面都有其特定的组件,更多的是利用了Controller这个组件。
接下来将通过一个简单的登录例子来学习Struts框架,并了解它这个框架的主要流程.由于是第一个例子会详细的将里面的一些内容都描述出来.
下载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)
- 创立LoginActionForm,处理登录页面(需要继承struts 的ActionForm),注意set中的后面的名字要跟表单的名称一摸一样.
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 "闲来无事"可以多浏览一下.
- 1楼smszhuang1683小时前
- 好,又复习了一遍