Struts2第一部分
学习思路
- 入门案例先敲熟(重点)
- 独立使用struts2框架完成登陆案例
知识点:
struts是JAVAEE结构中WEB层的框架。
框架概述
百度
是一组组件或者说是一个应用的半成品。
提高了生产效率和质量。
核心
- 拦截器
- action
- ognl与valuestack
与struts2类似框架
struts1 webwork springmvc jsf
struts2代替servlet
入门案例
//Servlet完成
/**
* Servlet 登陆案例
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收封装参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//调用业务层(模拟)
//页面跳转
if("aaa".equals(username)&&"123".equals(password)){
//成功,跳转success,重定向
response.sendRedirect(request.getContextPath()+"/success.jsp");
}else{
//失败,跳转fail
response.sendRedirect(request.getContextPath()+"/fail.jsp");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
struts入门案例执行流程
- 请求路径
- 被核心过滤器/前端控制器拦截
- 去找struts.xml文件中对应的action
使用struts2框架
- 导入jar包
- 在web.xml中配置一个filter(配置了才可以使用框架)
- struts2.xml配置
- 创建action完成操作
快速入门
struts2jar包目录解析
- apps:示例代码
- docs:文档
- lib:相关jar包
- src:源码
使用struts2框架不需要把所有jar包导入,只需要参考他的示例代码导包就可以了
配置StrutsPrepareAndExecuteFilter
<!--只有配置了才能使用框架-->
<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>
创建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>
<package name="default" namespace="/" extends="struts-default">
</package>
</struts>
使用struts2
在action中的name属性的值结合package中的namespace属性的值可以得到一个路径.从而调用指定的action方法.
<action name="struts2" class="com.it.ssh.web.struts2.Struts2Action" method="show"></action>
获取参数
在action类中提供成员变量和方法,就可以直接接收参数,名字必须和参数属性名相同.
public class LoginAction {
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 login(){
System.out.println("连接成功");
//获取参数
//判断
if("aaa".equals(username)&&"111".equals(password)){
return "success";
}else{
return "fail";
}
}
}
页面跳转
- 在action中的方法添加一个string返回值
- 在struts.xml配置确认跳转路径.
<!--页面跳转的配置-->
<action name="Login" class="com.it.ssh.web.struts2.LoginAction" method="login">
<result name="success">/success.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
Struts2核心文件
struts2共有三个部分的源代码
- 核心部分源代码
- core目录下的源代码
- xwork核心部分源代码
-
- 插件源代码
- 导源码:
- 配置dtd约束的提示功能
struts2完整执行流程
- 浏览器发送请求到服务器
- 服务器中的拦截器interceptor被加载,拦截请求
- 加载struts.xml,根据struts.xml的配置访问对应的action.
- 执行action
- 根据返回值找到对应的result标签
- 根据result属性来跳转视图.
struts2的配置文件struts.xml
- web.xml
- struts.xml
- struts-default.xml
- default.properties
加载顺序
第一个加载的是 default.properties 文件
位置:strtus2-core.jar 包 org.apache.struts2 包下
作用:主要是声明了 struts2 框架的常量
第二个加载的是一批配置文件
Strtus-default.xml
位置:struts2-corl.jar
作用:声明了 interceptor result bean
Strtus-plugin.xml
位置:在 strtus2 的插件包中
作用:主要用于插件的配置声明
Strtus.xml
位置:在我们自己的工程中作用:用于我们自己工程使用 strtus2 框架的配置
第三个加载的是自定义的 strtus.properties
位置:都是在自己工程的 src 下
作用:定制常量
第四自定义配置提供
第五加载的是 web.xml 配置文件
主要是加载 strtus2 框架在 web.xml 文件中的相关配置.
第六加载 bean 相关配置
配置文件加载流程
- default.properties
- struts-default.xml
- struts-plugin.xml
- struts.xml
- web.xml
重点掌握
- struts-default.xml能找到,知道里边有什么东西.
- default.properties找到,知道里边有什么.
- struts.xml每一个标签和每一个属性的作用.
struts.xml
package标签配置
- name属性:定义一个包的名称,必须唯一
- namespace属性:主要是与action标签的name属性联合使用来确定一个action的访问路径.
- extends属性:指定继承自哪个包,一般值是struts-default.struts-default包是在struts-default.xml文件中声明的.
- abstruct:代表当前包是一个抽象的,主要是用于被继承.
action标签配置
- name属性:主要是与package的namespace属性联合使用来确定一个action的访问路径.
- class属性:作用是用于指示当前的action类.这个类的全路径.
- method属性:用于指示当前的action类中的哪个方法执行.
result标签配置
主要用于指示结果视图的
- name属性:作用与action类的method方法的返回值进行匹配,来确定跳转路径.
- type属性:用于指定跳转方式(redirect是重定向,不写默认是转发)
关于action配置中的class与method的默认值
<!--
name属性的默认值是success
type的默认值是转发dispatcher.
-->
<action >
<result>/success.jsp</result>
</action>
如果查找不到指定的 class 及对应的 method 就会执行ActionSupport 类中的 execute 方法。
在这个类的 execute 方法中默认返回的是”success”也就是说,result 的 name 属性默认值是 success,默认的跳转方式是请求转发 dispatcher
常量配置
default.properties文件中定义了struts2框架的常用常量
- 可以在src下创建一个struts.properties
- 在web.xml下也可以
在filter标签中:
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</filter>
- 可以直接在struts2.xml中声明
在struts标签里
<contant name="" value=""></contant>
struts.i18n.encoding----编码(utf-8)
struts.action.extension---指定访问(action,,)struts2框架路径的拓展名
struts.devMode---开启关闭(true/false)
配置这项后会提供更加详细的错误信息,以及修改struts.xml后不需要重启服务器
注意:后加载的配置文件中的常量会将先加载的常量覆盖
action类的创建方式
普通类
在开发中不用.
继承(ActionSupport)
struts2中的action,主要是完成业务逻辑操作,替代了Servlet的作用
- 如何创建一个struts2的action
- 如何访问一个struts2的action
action类的创建方式详解
-
创建一个pojo类:
Pojo(plani Ordinary java object)简单的JAVA对象:就是没有实现任何接口,没有继承任何类的一个类.
优点:无耦合
缺点:所有的功能都要自己完成
-
实现Action(struts2中的)接口
在Action接口中定义了5个常量,1个execute方法.
5个常量都是默认的5中结果视图
<result name="常量值">
- ERROR:错误视图
- INPUT:它是struts2框架中interceptor发现问题后会访问的一个视图.
- LOGIN:登陆视图.可以在权限操作中使用
- NONE:什么都不做
- SUCCESS:成功视图
优点:耦合度低
缺点:还是需要自己完成功能
-
创建一个类继承ActionSupport类
ActionSupport类也实现了Action接口
我们在开发中一般使用这种方案
优点:功能多.
例如:表单校验,错误信息设置,国际化
缺点:耦合度高.
action类的访问
- 配置方式指定method(前边的知识)
标签访问
如果没有method访问execute
- 通配符(最常用)
关键字:*
<action name="XXX_*" class="" method="{1}"></action>
*代表想调用的方法名
{1}的作用获取第一个*号的值
<action name="*_*" class="XXX.XXX.XXX.{1}" method="{2}"></action>
*号的值用这种方式获得
不建议使用太多的*,带来了阅读的障碍.不便于理解
使用*简化操作方案,它对名称规范必须进行一个统一
拓展--动态方法的调用
个人不建议使用动态方法调用!!
Struts2的数据封装
属性驱动
- 直接在action类中提供与请求参数匹配属性提供get/set方法
- 在action类中创始一个javaBean,对其提供get/set。在请求页面上要进行修改,例如:user.username user.password
以上两种方法的优缺点:
- 第一种方法比较方便简单,但是在实际操作中我们需要将action的属性赋值给模型(javaBean)
- 第二种,不需要给javabean直接赋值,但是它要求在页面上必须使用ognl表达式,就存在页面不通用的问题。
模型驱动
让action实现一个接口ModelDrivern
实例化模型对象(new一个JavaBean)
重写getModel方法返回一个实例化的模型
对于模型驱动和属性驱动相比在实际开发中使用较多,但是它只能对一个模型数据进行封装。
关于 <result> 标签
result标签中的type属性标识页面跳转的方式:
- dispatcher 默认,转发
- redirect 重定向
- chain 请求转发,针对action跳转
- redirectAction 类似与重定向,针对action
全局result
<!--配置全局的result-->
<global-results>
<result name="" type=""></result>
</global-results>
网友评论