@Beeder
2017-12-31T13:01:11.000000Z
字数 7120
阅读 621
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.jarasm-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.propertiesinit_DefaultProperties();//加载struts-default.xml,struts-plugin.xml,struts.xmlinit_TraditionalXmlConfigurations();//加载自定义的struts.propertiesinit_LegacyStrutsProperties();//加载用户自定义配置提供者init_CustomConfigurationProviders();//加载web.xmlinit_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;}}