- 什么是Struts2的框架
- Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
- 其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
- Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
- 虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
- Struts2是一个基于MVC设计模式的Web层框架
- Web层框架的特点
- 都是一个特点,前端控制器模式
- 记住:前端控制器(核心的控制器)
- Struts2框架前端的控制器就是过滤器
现在struts2的框架已经逐渐被Springmvc替换了,看了structs2的教学然后总结一点小知识,以防要用的时候看看
Strust struts.xml action
Servlet是单实例多线程的,而Action是多实例多线程的。
因为多实例,所有每个请求会产生不同的Action和ActionContext对象,
因此线程是安全的。同时因为Action是多实例的,所以Action中可以有成员变量,
因为多实例不会公用。
而Servlet是单实例多线程,所以一般情况下不会定义成员变量,因为共用同一个成员变量可能出现线程安全的问题。
流程:
jsp根据路径的请求去structs.xml中找类中对应的action方法,封装数据后,逐层请求,然后经过返回值来跳转到相应的界面,以前我们使用Servlet来封装接受数据,现在我们只要Action,然后调用Action中的方法,不需要建议多个。
在web.xml中先配置前端控制器
绝对不能 忘记前端的控制器
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
封装数据的几种方式
属性驱动
模型驱动(重要)
public class SaveAction extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = -815170753112346710L;
private User student=new User();//必须手动实例化,模型封装
@Override
public User getModel() {
return student;
}
public String save() {
new AddService().saveStudent(student);
return "success1";
}
}
主要是jsp页面的跳转,关于数据的封装,传数据到后台,获取后台数据返回前端
重点是配置拦截器《自定义拦截器以后,不要忘记配置默认的拦截器》
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 要想用动态开启动态方法访问变量 <constant name="struts.enable.DynamicMethodInvocation" value="true"/> -->
<package name="demo1" namespace="/" extends="struts-default">
<action name="SaveAction" class="com.edu.Action.SaveAction" method="save">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
jsp界面
<form action="${pageContext.request.contextPath }/SaveAction.action">
请输入id<input type="text" name="id">
请输入账户<input type="text" name="username">
请输入密码<input type="password" name="password">
请输入年龄<input type="text" name="age">
<input type="submit" value="提交">
</form>
关于跳转访问的问题我在前面的博客已经说了,这里就不说
需要在struts.xml中进行拦截器的配置,配置一共有两种方式
关于拦截器的使用
<!-- 定义了拦截器 第一种方式 <interceptors> <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/> </interceptors> -->
<!-- 第二种方式:定义拦截器栈 -->
<interceptors>
<interceptor name="DemoInterceptor" class="com.edu.interceptor.DemoInterceptor"/>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="DemoInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="userAction" class="com.edu.demo3.UserAction">
<!-- 只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈 <interceptor-ref name="DemoInterceptor"/> <interceptor-ref name="defaultStack"/> -->
<!-- 引入拦截器栈就OK -->
<interceptor-ref name="myStack"/>
</action>