Struts2环境的搭建
(1)下载Struts2
目录结构
apps:该文件夹下包含了基于Struts2的示例应用
docs:包含了Struts2的相关文档
lib:包含了Struts2的核心类库,以及Struts2的第三方类库
src:包含了Struts框架的所有源代码
(2)创建web项目,导入struts2所需jar包,lib中有struts2的所有jar包,但是我们不需要那么多。
我们只把必需的添加到项目即可。将apps目录下struts2-blank.war压缩包中的lib目录下的jar包添加到我们项目中即可。这是struts2必需的jar包。
Struts2架构
struts使用拦截器作为增强处理,以用户的逻辑控制器为目标,创建一个控制器代理,控制器代理回调业务控制器的execute方法处理用户请求,该方法的返回值决定struts2将怎样的视图资源呈现给用户
struts2大致处理流程:
(1)浏览器发送请求
(2)核心控制器根据请求决定是否调用相应的Action
(3)struts2内置的拦截器链会自动对请求进行一些操作
(4)回调Action的execute方法,执行操作。
(5)Action会将处理结果存入stack Context中,并返回字符串,核心控制器根据字符串跳转到指定的视图资源。
(6)视图资源会读取Stack Context中的信息,向浏览器生成响应数据。
Struts2入门案例
(1)编辑web应用的web.xml配置文件,配置struts2的核心拦截器。
<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>
(2)从用户请求开始,我们实现一个登陆表单
这里的action属性比较特殊,不是普通的servlet。
当表单提交给login时,struts的拦截器会起作用,调用用户开发的Action处理用户请求
<body>
<form action="login" method="post">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
(3)实现控制器Action类处理用户请求
我们已经指出,MVC框架的核心就是控制器,控制器处理具体用户请求。
这个类实现Action接口,并实现接口的execute方法。
该类包含的多个属性用于封装用户的请求参数。 我们可能现在很难理解,我们请求的参数是怎么赋值给这个类的。
我们说过,在调用Action方法之前,struts2的内置拦截器会自动负责解析用户请求参数,并赋值给Action相应的参数
public class LoginAction extends Action{
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;
}
//判断用户名和密码是否相同
public String execute(){
if(getUsername().equals("cad")&&getPassword().equals("123456")){
return "success";
}else
{
return "error";
}
}
}
(4)配置Action
我们用户发送login请求,那么如果根据login请求去调用相应的Action实现类呢?这就需要我们去配置Action。
配置struts.xml ,struts.xml应该放在src的classes路径下
<package name="demo" extends="struts-default"> //包 name随便取,extends 照写就ok
<action name="login" class="com.cad.struts2.LoginAction"> //action name为login,即为负责处理login的请求,action默认调用自身的execute方法处理请求
<result name="success">/welcome.jsp</result> //根据返回的字符串转发到相应页面
<result name="error">/error.jsp</result>
</action>
</package>
Struts2两个重要组成部分
struts2核心就是核心控制器和业务控制器。
核心控制器StrutsPrepareAndExecuteFilter
StrutsPrepareAndExecuteFilter作为一个filter运行在web应用中,负责拦截所有用户请求,该filter 会过滤用户请求,然
后将请求都交给struts2框架处理。拦截器会默认拦截扩展名为.action的请求,什么后缀名都不写也可以。例如
hello.action或者hello都会进行拦截。xxx.jsp就不会进行拦截,直接放行。
struts2内部运行流程
(1)客户端发出HTTP请求
(2)然后请求被核心过滤器StrutsPrepareAndExecuteFilter拦截
(3)核心过滤器将请求转发到Action映射器,Action映射器负责识别当前的请求是否需要交由Struts2处理。
(4)Action映射器返回需要struts2处理的信息,StrutsPrepareAndExecuteFilter会创建一个Action代理
(5)Action代理并不知道执行哪一个Action,它会向配置管理器询问调用哪一个Action,配置管理器会从struts.xml读取我们配置的Action信息。
(6)Action代理创建相关请求的Action对象,调用相关的方法之前,struts2的一系列拦截器会帮我们做一些操作,例如获取请求参数等。
(7)然后调用execute方法根据返回的字符串去匹配相应的页面,
(8)页面可以获取一些页面模板,然后生成最终页面,再倒序的执行拦截器的后续操作
(9)最后生成HTTP响应内容