@Beeder
2017-12-31T21:01:11.000000Z
字数 7120
阅读 531
javaWeb
Struts2
Web层的框架
Struts2框架概述:前端控制器模式
编写的页面,点击超链接,请求提交到服务器端
请求会先经过Struts2的核心过滤器(StrutsPrepareAndExecuteFilter)
过滤器的功能是完成了一部分代码功能
就是一系列的拦截器执行了,进行一些处理工作
咱们可以在struts-default.xml配置文件中看到有很多的拦截器。可以通过断点的方式来演示
拦截器执行完后,会根据struts.xml的配置文件找到请求路径,找到具体的类,通过反射的方式让方法执行
https://struts.apache.org/ -- 官网地址
* apps -- Struts2框架提供了一些应用
* libs -- Struts2框架开发的jar包
* docs -- Struts2框架开发文档
* src -- Struts2框架源码
//文件上传(依赖common-io)
common-fileupload-1.2.1.jar
//处理IO操作的工具类库
common-io-1.3.2.jar
//Freemarker模板语言支持类库(视图展现技术)
freemarker-2.3.15.jar
//OGNL表达式语言类库(对象图形导航语言,用于做数据操作 )
ognl-3.7.3.jar
//struts2框架核心包
struts2-core-2.3.8.1.jar
//xwork的核心类库
xwork-core-2.1.6.jar
//分析、编辑和创建Java字节码的类库
javassist-3.11.0GA.jar
//ASM是一个Java字节码处理框架,使用它可以动态生成stub类和proxy类,在Java虚拟机装载类之前动态修改类的内容
asm-commons-3.3.jar
asm-3.3.jar
//包含了一些数据类型工具类,是java.lang.*的扩展
commons-lang3-3.1.jar
<h3>Struts2的入门程序</h3>
<a href="${ pageContext.request.contextPath }/hello.action">Struts2入门程序</a>
路径:\WebContent\WEB-INF\web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>day32</display-name>
<!-- 配置核心的过滤器 -->
<filter>
<!--filter-name命名不影响使用-->
<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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<!--省略代码……-->
</welcome-file-list>
</web-app>
//加载org/apache/struts2/default.properties
init_DefaultProperties();
//加载struts-default.xml,struts-plugin.xml,struts.xml
init_TraditionalXmlConfigurations();
//加载自定义的struts.properties
init_LegacyStrutsProperties();
//加载用户自定义配置提供者
init_CustomConfigurationProviders();
//加载web.xml
init_FilterInitParameters() ;
xwork-core-2.1.6.jar中org/apache/struts2/目录
用于定义常量,不修改
xwork-core-2.1.6.jar目录下
配置核心功能,配置拦截器<interceptor></interceptor>
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>
<!-- 编写常量 struts-default.xml中默认配置value="ation,,"
<constant name="struts.action.extension" value="do,,"></constant>
-->
<!-- 开启动态方法访问 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 包结构 -->
<!--extends="struts-default":继承struts-default.xml-->
<package name="demo1" namespace="/" extends="struts-default">
<!-- 配置Action -->
<action name="hello" class="com.itheima.action.HelloAction" method="sayHello">
<!-- 配置跳转的页面,路径的写法:在Struts2框架中,不管是转发还是重定向,都不用写项目名 -->
<result name="ok">/demo1/suc.jsp</result>
</action>
<!-- POJO类的方式 -->
<action name="demo1Action" class="com.itheima.action1.Demo1Action"/>
<!-- 实现Action接口的方式 -->
<action name="demo2Action" class="com.itheima.action1.Demo2Action">
<result name="login">/demo1/suc.jsp</result>
</action>
<!-- 继承ActionSupport类的方式 -->
<action name="demo3Action" class="com.itheima.action1.Demo3Action"/>
</package>
<!-- 演示Action的访问, -->
<package name="demo2" namespace="/" extends="struts-default">
<!-- 传统方式 -->
<action name="saveCust" class="com.itheima.action2.CustomerAction" method="save"/>
<action name="delCust" class="com.itheima.action2.CustomerAction" method="delete"/>
<!-- 通配符的方式 -->
<action name="linkman_*" class="com.itheima.action2.LinkmanAction" method="{1}">
<result name="saveOK">/demo1/suc.jsp</result>
<result name="delOK">/demo1/suc.jsp</result>
</action>
<!-- 配置动态方法访问 -->
<action name="user" class="com.itheima.action2.UserAction"/>
</package>
<!-- 引入其他的配置文件 -->
<include file="com/itheima/user/struts_user.xml"/>
</struts>
POJO类:没有继承某个类,没有实现接口,就是POJO的类
/*
方法要求:
方法必须为public
方法必须有返回值,且为String
方法不能带有参数
页面跳转:
1、return “字符串”
2、在Struts.xml配置文件中,配置跳转的页面
*/
public class HelloAction {
public String sayHello(){
// 编写代码 接收请求的参数
System.out.println("Hello Struts2!!");
return "ok";
}
/**
* 演示的method方法的默认值
* @return
*/
public String execute(){
System.out.println("method方法的默认值是execute");
System.out.println("这是一个POJO类...");
//return null代表不跳转
return null;
}
}
//Action接口中定义5个静态常量
SUCCESS //成功.
xINPUT //用于数据表单校验.如果校验失败,跳转INPUT视图.
LOGIN //登录.
ERROR //错误.
NONE //页面不转向.
public class Demo2Action implements Action{
public String execute() throws Exception {
System.out.println("Demo2Action实现了Action的接口");
// 表示页面不跳转
return NONE;
}
}
public class Demo3Action extends ActionSupport{
private static final long serialVersionUID = 2183101963251216722L;
public String execute() throws Exception {
System.out.println("Demo3Action继承了ActionSupport类...");
return NONE;
}
}
demo.jsp
<h3>传统的配置文件的方式</h3>
<a href="${ pageContext.request.contextPath }/saveCust.action">保存客户</a>
<a href="${ pageContext.request.contextPath }/delCust.action">删除客户</a>
status2.xml
<!-- 传统方式 -->
<action name="saveCust" class="com.itheima.action2.CustomerAction" method="save"/>
<action name="delCust" class="com.itheima.action2.CustomerAction" method="delete"/>
CustomerAction.java
public class CustomerAction extends ActionSupport{
// 保存客户
public String save(){
System.out.println("保存客户...");
return NONE;
}
// 删除客户
public String delete(){
System.out.println("删除客户...");
return NONE;
}
}
demo.jsp
<h3>通配符的方式(应用比较多)</h3>
<a href="${ pageContext.request.contextPath }/linkman_save.action">保存联系人</a>
<a href="${ pageContext.request.contextPath }/linkman_delete.action">删除联系人</a>
<!-- 通配符的方式 -->
<!--linkman_*:匹配web页面ation-->
<action name="linkman_*" class="com.itheima.action2.LinkmanAction" method="{1}">
<result name="saveOK">/demo1/suc.jsp</result>
<result name="delOK">/demo1/suc.jsp</result>
</action>
public class LinkmanAction extends ActionSupport{
private static final long serialVersionUID = -6462671346088624621L;
public String save(){
System.out.println("保存联系人...");
return "saveOK";
}
public String delete(){
System.out.println("删除联系人...");
return "delOK";
}
}
demo.jsp
<h3>动态方法访问的方式</h3>
<!--status2.xml中constant的name+!+java方法-->
<a href="${ pageContext.request.contextPath }/user!save.action">保存用户</a>
<a href="${ pageContext.request.contextPath }/user!delete.action">删除用户</a>
<!-- 开启动态方法访问 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 配置动态方法访问 -->
<action name="user" class="com.itheima.action2.UserAction"/>
public class UserAction extends ActionSupport{
public String save(){
System.out.println("保存用户...");
return NONE;
}
public String delete(){
System.out.println("删除用户...");
return NONE;
}
}