servlet:
void init(ServletConfig cfg):// 读取servlet的配置参数
void service(ServletRequest request, ServletResponse response);// 服务方法,用户每次访问都会被执行
void destroy();// 销毁方法
filter:
void init(FilterConfig cfg);// 读取filter的配置参数
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain);// 过滤方法,每次访问被过滤的资源都被执行
void destroy();// 销毁方法
OGNL:STRUTS2通过其读写对象的属性
搭建struts2的开发环境:
1.下载官方的struts2的发行包:struts2-2.3.15.3-all
2.导入jar包到lib目录下:直接拷贝struts2发行包的appstruts2-blankWEB-INFlib下的jar即可
3.在构建目录的顶端,建立一个struts2.xml配置文件
4.在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>
5.验证,部署到tomcat服务器,启动,没有错误提示,成功
// 规范
// 指定访问是添加的后缀名字,多个后缀名以英文逗号(,)隔开
<constant name="struts.action.extension" value="action,"/>
// 当struts2的配置文件修改后,系统是否加载修改后的文件,默认为false
<constant name="struts.configuration.xml.reload" value="false"/>
// 开发模式开启
<constant name="struts.devModel" value="true"/>
// 设置视图的主题
<constant name="struts.ui.theme" value="simple">
// 长传文件大小的设置
<constant name="struts.multipart.maxSize" value="1073930"/>
package元素:
name:必须唯一
extends:必须继承struts-default,否则struts2的核心功能将无法使用
namespace:命名空间,一般以"/" 开头,表示动作的访问路径:命名空间+动作名,不写默认为访问的该项目下的动作名
action元素:
name:动作名
class:动作类的完整路径名,会根据反射机制实例化.反射获得构造方法,获得普通方法,获得字段属性
method:方法名,默认是execute();
反射机制:反着来,有对象得到类名,Class.forName():获取类对象
在实际的操作过程中,凡是看到有参数传递了一个完整的"包.类"的形式,一般都是使用的反射机制作用的
有重大数据,或者除了美元之外,所有的指数都在跌,之前多头行情大涨,一出现跌,你就可以去买跌,因为买跌
是大趋势,在大趋势面前才可以稳定的赚钱
// 获取ServletAPI相关对象的实例
public class ActionDemo extend ActionSupport{
public String execute(){
HttpServletContext request = ServletActionContext.getRequest();
HttpServletContext response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();
return null;
}
}
获取ServletAPI的原因:拦截器(ServletConfig)会给你注入这些实例
结果视图:
1.局部视图:服务于当前动作的结果
<action name="upload" class="com.deng.UploadAction" method="execute">
<result name="success" type="dispatcher">/1.jsp</result>
</action>
2.全局视图:动作访问,当在局部视图中没有找到时候,去全局视图找
<package name="p1" extends="struts-default">
<global-results>
<result name="success" type="dispatcher">1.jsp</result>
</global-results>
</package>
result元素
name:逻辑视图的名称,他对应的是动作方法的返回值,默认为success
type:达到目标的形式,默认为dispatcher,转发
struts2的结果类型
在struts-default.xml中
1.chain:用户转发到另一个动作
<action name="c1" class="com.deng.Ac1" method="m1">
<result name="success" type="chain">c2</result>
</action>
<action name="c2" class="com.deng.Ac2" method="m2">
<result name="success" type="dispatcher">/1.jsp</result>
</action>
转发到不同命名空间的另外一个动作
<action name="c1" class="com.deng.Ac1" method="m1">
<result name="success" type="chain">
<!--给chain对应类型的处理类,注入参数值,调用的是setter方法
<param name="namespace">/n2</param>
<param name="actionName">c2</param>
</result>
</action>
<action name="c2" class="com.deng.Ac2" method="m2">
<result name="success" type="dispatcher">/1.jsp</result>
</action>
2.dispatcher:转发到另外一个jsp页面
<action name="upload" class="com.deng.UploadAction" method="execute">
方法一:<result name="success" type="dispatcher">/1.jsp</result>
方法二:<result name="success" type="dispatcher">
<param name="location">/1.jsp</param>
</result>
</action>
3.freemarker:用于转发到另外一个freemarker模板,页面静态化,一种用来生成静态文本的工具
4.velocity:用于转发到另外一个velocity模板
5.httpheader:用来输出http协议的消息头
6.redirect:用于重定向到另外一个页面
7.redirectAction:用于重定向到另外一个动作
8.stream:用于文件下载
9.plainText:以纯文本的形式展现
--------------------------------------
封装用户请求参数,very important
1.动态参数(用户请求的参数)注入
方式一:用Action的动作类作为模型对象
login.jsp
<form action="${pageContext.request.contextPath}/regist.action" method="post">
username:<input name="username" type="text">
password:<input name="password" type="text">
<input type="submit" value="ok"
</form>
struts.xml配置文件
<package name="p1" extends="struts-default">
<action name="regist" class="comg.deng.ResigtAction" method="regist">
<result name="success">/success.jsp</result>
<reuslt name="login">/login.jsp</result>
</action>
</package>
动作类,动作类当作模型对象
public class RegistAction extend ActionSupport{
private String password;
private String username;
public String getUsername(){
return username;
}
// 框架会按照表单的提交的参数值,调用对应的setter属性
public void setUsername(String username){
this.username = username;
}
。。。
public String regist(){
System.out.println(username+":"+password);
if("abc".equals(username)&&"123".equals(password))
return SUCCESS;
else
return LOGIN;
}
}
方式两:模型和动作类分开
模型就是一个javaBean
public class Person implements Serializable{
private String username;
private String password;
public String getUsername(){
return username;
}
public void setUsername(){
this.username = username;
}
public String getPassword(){
return password;
}
public void setPassword(){
this.password = password;
}
@override
public String toString(){
return "Person[username="+"username+",password="+password+"]";
}
}
动作类
public class RegistAction extends ActionSupport{
// new 一个对象
Person person = new Person();
// 生成对象的getter和setter方法
public String getPerson(){
return person;
}
public void setPerson(Person person){
this.person = person;
}
public String regist(){
System.out.println(username+":"+password);
if("abc".equals(username)&&"123".equals(password))
return SUCCESS;
else
return LOGIN;
}
}
配置文件
<package name="p1" extends="struts-default">
<action name="regist" class="comg.deng.ResigtAction" method="regist">
<result name="success">/success.jsp</result>
<reuslt name="login">/login.jsp</result>
</action>
</package>
表单
<form action="${pageContext.request.contextPath}/regist.action" method="post">
username:<input name="person.username" type="text">
password:<input name="person.password" type="text">
<input type="submit" value="ok"
</form>
方法三:模型驱动ModelDriven
一个javaBean
public class Person implements Serializable{
private String username;
private String password;
public String getUsername(){
return username;
}
public void setUsername(){
this.username = username;
}
public String getPassword(){
return password;
}
public void setPassword(){
this.password = password;
}
@override
public String toString(){
return "Person[username="+"username+",password="+password+"]";
}
}
动作类
public class RegistAction implements ModelDriven<Person>{
// new 一个对象
private Person person = new Person();
// 生成对象的getter和setter方法
public String getPerson(){
return person;
}
public void setPerson(Person person){
this.person = person;
}
public String regist(){
System.out.println(username+":"+password);
if("abc".equals(username)&&"123".equals(password))
return SUCCESS;
else
return LOGIN;
}
public Person getModel(){
return person;
}
}
配置文件
<package name="p1" extends="struts-default">
<action name="regist" class="comg.deng.ResigtAction" method="regist">
<result name="success">/success.jsp</result>
<reuslt name="login">/login.jsp</result>
</action>
</package>
表单
<form action="${pageContext.request.contextPath}/regist.action" method="post">
username:<input name="username" type="text">
password:<input name="password" type="text">
<input type="submit" value="ok"
</form>
// 静态参数注入
<package name="p1" extend="struts-default" namespace="/usr">
<action name="a1" class="com.deng.TomorrowAction" method="m1">
<param name="name">student</param>
<action>
</package>
public class TomorrowAction extends ActionSupport{
private String name;// 这个name的值就是:student
public String getName(String name){
return name;
}
public void setName(){
this.name = name;
}
public String m1(){
System.out.println(name);
return null;
}
}