一、首先先问一下Action是什么?
Action是HTTP请求与业务逻辑之间的适配器
二、Action什么时候被初始化?
是发出Action请求时初始化,不是在读取配置时初始化。
三、其次看一下开发Action的步骤:
1、创建一个类,继承Action
2、注册struts-config.xml(配置文件如下)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
< action
input ="/form/login.jsp"
name ="loginForm"
path ="/login"
scope ="request"
type ="com.yourcompany.struts.action.LoginAction" >
</ action >
path:指明调用jsp能通过中心控制器ActionServlet找到该Action
type:指该Action类全名
name:该action引用Form的名称(form是为action服务的,所以要先创建form类)
input:如果表单验证不通过,则跳转指定的目标模块
四、Acton是安全的吗?为什么?
Action本身是不安全的,所以要注意线程安全,因为一个Action类只创建一个Action实例,控制器会共享同一实例。
Action实例存放的地方:它的实例是放在RequestProcessor类的processAtionCreate()方法中的HashMap中。
如:protected HashMap actions = new HashMap();
五、如何创建安全的多线程Action类?
保证线程安全的重要原则是在Action类中仅仅使用局部变量,谨慎地使用实例变量,所以每个线程有独立的局部变量,不会被其他线程共享 ,当线程执行完execute()方法时,它的局部变量会被销毁。
六、不安全的Action类可以用于什么地方?
可以用于计数。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
synchronized ( new Integer(count)){ // synchronized锁的是一个对象,不能是值,所以要new
count ++ ; // 为的是线程安全
}
PrintWriter out = response.getWriter();
out.print( " count= " + count);
return null ;
}