Struts1学习讲义
- 环境准备
- 整体框架结构
- struts-config.xml配置文件
- Formbean
- Action
- 注意事项
环境准备
1、相应的jar包,基本的有:javax-servlet-api:3.1.0, struts-core:1.3.10, jstl:1.2等,若需要连接数据库,还要commons-collections包等
2、eclipse新建web项目,不必自动添加struts属性,在web.xml中,注册对应的ActionServlet即可,如下:
<servlet>
<servlet-name>actionServlet</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>
</servlet>
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
真正的struts配置文件被连接在了/WEB-INF/struts-config.xml路径下,里面会配置Action, Formbean的具体属性参数,稍后详述;
定义了所有形如.do结尾的url均被struts的ActionServlet截获,由struts来处理
整体框架结构
基本流程是:
url请求(.do结尾的)
—>ServletMapping截获请求,交给ActionServlet处理
—>struts-config.xml根据url指派具体的Action(相当于Controller层)
—>Action的execute()方法执行具体的业务逻辑(Controller–>Model层)
—>返回ActionForward对象,struts-config.xml分发具体转向的jsp页面(Controller–>View层)
具体图示如下:
解释一下:
struts-config.xml中配置了FormBean和Action,action内部属性可以配置使用哪一个FormBean,同时配置了自己的url请求匹配规则,就可以把请求提交的表单域自动填充到对应的FormBean对象中
当然直接用formbean为媒介操作数据库不太合理,可以中间在加一层pojo类过度;
HelloAction实际调用方法execute内部处理具体的业务逻辑,最终返回一个ActionForward对象,struts-config.xml可以根据返回对象来决定转向哪一个页面,实现最终的展示View层
struts-config.xml配置文件
各项属性说明,见如下示例代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<description></description>
<form-beans> <!-- 配置Formbean -->
<!-- name表示form-bean标识,type是类的全限定名 -->
<form-bean name="helloForm" type="formbean.HelloForm" ></form-bean>
</form-beans>
<global-exceptions/> <!-- 配置异常处理页面 -->
<global-forwards/> <!-- 配置全局jsp页面 -->
<action-mappings> <!-- 配置Action -->
<action
path="/hello" <!-- path标识映射url路径,匹配hello.do形势,自动加.do -->
type="action.HelloAction" <!-- 对应的Action类 -->
attribute="helloForm" <!-- FormBean在request中的位置,request.geteAttribute('helloForm') -->
input="/hello.jsp" <!-- 输入页,Action中执行mapping.getInputForward()得到该页 -->
name='helloForm' <!-- 本Action实用的Formbean,对应上面的FormBean -->
scope="request" > <!-- 作用域,包括request, session等 -->
<forward name="success" path="/index.jsp"/> <!-- forward转向到的jsp页面,name是名称,用于Action中的mappiing.forward("") -->
</action>
</action-mappings>
</struts-config>
struts-config.xml是核心配置文件,扮演MVC中controller的角色,负责分发具体action,接受返回参数并决定调用那个页面
web.xml代码
<?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" 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>struts1_compare</display-name>
<servlet>
<servlet-name>actionServlet</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>
</servlet>
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<resource-ref>
<!-- struts1.3之后就不在支持在struts-config.xml中配置数据源了,需要在web.xml中配置 ,[JNDI配置数据源](https://www.cnblogs.com/xdp-gacl/p/3951952.html))
-->
</resource-ref>
</web-app>
web.xml里面配置struts1的核心servlet类:ActionServlet,并配置servlet的url匹配规则,,本质上就是一个servlet
只不过在servlet内部以的形式配置了strtus-config.xml,这样就建立了关联关系
配置具体struts-config.xml 路径是,,必须制定param-name名为config,,Struts才能识别并解析;弱配置多个,则需要以config 为上级目录
如: config -》/WEB-INF/struts-config1.xml 这个配置文件被映射到应用的根路径下,代表总的配置文件 config即代表着应用根路径
config/user1 -》/WEB-INF/struts-config2.xml 这个配置文件被映射到应用的 /user1下,代表子模块配置
Action代码
package action;
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;
public class HelloAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// TODO Auto-generated method stub
request.setAttribute("aaa", "struts can be succeed!");
System.out.println(11111111);
return mapping.findForward("success");
}
}
Action实现具体业务逻辑,传入参数包括ActionMapping 和 ActionForm类,前者代表了struts-config.xml中配置属性,后者代表了Form对象;
最后返回ActionForward类型,mapping.findForward(“success”),关键字success,对应着struts-config.xml中forward属性,配置了转向哪个页面
FormBean代码
package formbean;
import org.apache.struts.action.ActionForm;
public class HelloForm extends ActionForm{
private String hello;
public String getHello() {
return hello;
}
public void setHello(String hello) {
this.hello = hello;
}
}
本例中基本没用到formbean,表单填充,操作数据库用的多
View层jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>This is my Hello page. </h1><br>
<h3>
Success for User's struts1!
</h3>
<h6>
<%= request.getAttribute("aaa") %>
</h6>
</body>
</html>
结束
访问 http://localhsot:8080/projectName/hello.do
最终效果为:
最后,推荐一个更为详细讲解:struts1深入讲解