Struts 是Apache所开发的一个web应用框架,用来简化web开发的中常用、重复的工作。
原理图:
在以前的的开发中,浏览器的请求会找一个Servlet处理,然后返回浏览器,而在struts中所有的请求都会找一个叫做ActionServlet处理,它会根据配置文件配的action来将请求交给指定的Action来处理。
配置Struts:
1.引入Struts的jar包
2.在web工程目录下新建struts-config.xml(它用来配置struts如何工作)
3.配置web.xml中Struts的ActionServlet处理请求
引入jar包和配置文件后工程结构目录应为:
web.xml 配置如下节点:
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" 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"> <display-name>Struts</display-name> <servlet> <!-- 这个ActionServlet是Struts用来处理所有请求并根据配置文件调用指定的Action,没有它Struts无从谈起 --> <servlet-name>ActionServlet</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <!-- ActionServet在init方法中读取config配置项,来决定如何处理这个请求。 --> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 处理所有*.st的请求 --> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.st</url-pattern> </servlet-mapping> </web-app>
配置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> </struts-config>
这里的配置文件是空的,struts所有的配置都在<struts-config></struts-config>节点中配置
从上面的Struts工作原理图可以看出,请求先被ActionServlet处理,然后转到指定的Action中进行业务逻辑的处理(这个Action可以理解为MVC模式里的控制器),处理完毕后返回ActionServlet,再由ActionServlet返回浏览器。
第一个案例:
1.新建一个处理请求的Action并覆盖父类的execute方法,它继承至Action类
2.配置struts-config.xml文件,指定某个请求由这个Action处理.
新建一个用于处理请求的Action
package struts.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 IndexAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("msg", "IndexAction 处理....."); return mapping.findForward("index");//这个index在struts-config.xml文件中action节点的子节点中配置,表示跳转路径。
} }
在struts-config.xml中配置action
<?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> <action-mappings> <action path="/Index" type="struts.action.IndexAction"> <forward name="index" path="/WEB-INF/jsp/Index.jsp"></forward> </action> </action-mappings> </struts-config>
这里的action-mapping节点中的每一个action节点表示一个action
action节点的属性含义
path:它表示这个action处理它指定的路径
type:action处理类的路径
action节点中的forward节点表示,跳转路径。
到这里就配置完毕了,启动tomcat,访问:http://localhost:8080/DemoStruts/Index.st
就会看到
是不是挺简单,不过strtus只能做这点事情,用它干嘛呢?
它可以简化web开发中的一些重复、繁杂的劳动,仅仅是简化而已,而不是替代,它能做得事情用传统的jsp技术也能做。
简化一 表单注册,它自动封装表单数据到一个bean
1.新建一个bean 继承至actionfrom
package struts.bean; import org.apache.struts.action.ActionForm; public class RegisterUserBean 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; } }
2.新建一个Action用于处理这个请求
package struts.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; import struts.bean.RegisterUserBean; public class RegisterAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //从ActionForm拿到封装后表单数据 RegisterUserBean userbean=(RegisterUserBean) form; System.out.println(userbean.getUsername()); request.setAttribute("msg", userbean.getUsername()); return mapping.findForward("index"); } }
3.配置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> <form-beans> <form-bean name="registeruser" type="struts.bean.RegisterUserBean"></form-bean> </form-beans> <action-mappings> <action path="/Index" type="struts.action.IndexAction"> <forward name="index" path="/WEB-INF/jsp/Index.jsp"></forward> </action> <action path="/RegisterUI" type="struts.action.RegisterUIAction"> <forward name="registerui" path="/WEB-INF/jsp/RegisterUser.jsp"></forward> </action> <action path="/RegisterAction" name="registeruser" type="struts.action.RegisterAction"> <forward name="index" path="/WEB-INF/jsp/Index.jsp"></forward> </action> </action-mappings> </struts-config>
这样就配置OK了.
Struts 转发请求:
浏览器发起一个请求,首先进入ActionServlet,它根据配置文件对这个请求做一系列的封装和处理(可以理解为预处理)后调用处理这个请求的Action类的Execute方法,Action处理完毕后返回一个ActionForward,ActionSerlvet根据返回的ActionServlet决定如何跳转。