一、servlet缺陷
1.重复性劳动太多(代码冗余)。
2.具体代码放入control中,臃肿。
二、引入Struts2
!表现层MVC框架!
包含WebWork2的核心以及Struts的特性和功能
三、Struts2开发环境
①核心包:1.struts2-core
2.xwork-core
②配置文件
<?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></struts>
③配置控制器
<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>
四、Struts2案列
①配置文件
<package name="p1" extends="struts-default">
<action name="hello" class="com.itheima.web.action.HelloAction" method="sayHello">
<result name="success">/success.jsp</result>
</action>
</package>
name:地址
class:指定动作类
method:执行的方法
extends:继承struts-default
namespace:名称空间
(默认 不写或者“”)
名称空间 + 动作名称 = 访问路径
②动作类
public String sayHello(){
System.out.println("HelloAction的sayHello方法执行了");
return "success";//与配置文件中result的name取值相对应
}
③图示
五、Struts2常量
1.struts.i18n.encoding 使用编码
2.struts.multipart.parser 指定文件上传组件
3.struts.multipart.maxSize 文件上传大小限制
4.struts.action.extension 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔
5.struts.devMode 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。
六、元素
1.action元素
name:动作名称
class:动作类全名
method:方法名称
(默认public String execute(){})
SUCCESS->动作方法执行一切OK
ERROR->动作方法执行时遇到了异常
INPUT->回显
LOGIN->转向登录页面
NONE->不转向任何视图
继承 extends ActionSupport
2.result元素
name:逻辑视图的名称,对应着动作方法的返回值。默认值是success
type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher。redirect:重定向
(redierctionAction:使用的是重定向)
param子元素
依赖注入(Dependence Injection)思想
七、动作类中访问Servlet的API
1.使用ServletActionContext类
2.使用实现接口的方式extends ActionContext
*八、封装请求正文到对象中*
1.动态参数封装:通过用户的表单封装请求正文参数
2.动作类和实体模型分开
3.模型驱动:建立动作类和模型分开的前提下(开发中采用的方式)
八、Struts2中的拦截器
AOP编程思想
拦截器类试图
编写步骤
a.编写一个类,继承AbstractInterceptor类或者实现Interceptor接口。重写intercept方法
b.配置拦截器:注意拦截器必须先声明再使用
c.多个拦截器执行顺序是由使用顺序决定的
<package name="p2" extends="struts-default">
<interceptors>
<interceptor name="checkLoginInterceptor1" class="com.itheima.web.interceptor.CheckLoginInterceptor1" />
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checkLoginInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<action name="login" class="com.itheima.web.action.Demo2Action" method="login">
<interceptor-ref name="myDefaultStack">
<!-- 在引用自定义拦截器栈的时候,给指定的拦截器注入参数。方式就是:拦截器名称.属性名称 -->
<param name="checkLoginInterceptor1.excludeMethods">login</param>
</interceptor-ref>
<result type="redirectAction">showMain</result>
</action>
<action name="showMain" class="com.itheima.web.action.Demo2Action" >
<result>/main.jsp</result>
</action>
<action name="showOther" class="com.itheima.web.action.Demo2Action" >
<result>/otherpage.jsp</result>
</action>
</package>