Struts2框架学习笔记1
1,框架概述
1.1,什么是框架(了解)
将一些重复性的代码进行封装,简化程序员的编程操作,可以使得程序员在编码中把更多的精力放到业务需求的分析和理解上面,相当于一个半成品软件。
1.2,三大框架(掌握)
SSH:struts、hibernate、spring
SSM:springmvc、mybatis、spring(现在更流行)
1.3,三层架构(掌握)
表现层-->业务层-->数据层 即:Web-->Service-->Dao
MVC架构(Model,View,Controller):模型层(javabean class) --> 视图层 (jsp,html) --> 控制层 (Servlet,Filter)
1.4,Servlet 和 Filter(重点)
Servlet:
Filter:
Servlet能做的事情,过滤器也可以做到。并且过滤器比Servlet还多了一个放行的功能,因此过滤器比Servlet功能更为强大。
结论就是:过滤器同样也适合做控制器。
2,Struts简介
2.1,struts2概述(了解)
Struts2是Apache发行的MVC开源框架。注意:它只是表现层web(MVC)框架。
2.2,Struts2与Struts1的关系(了解)
Struts1:
Struts1也是apache开发的一套mvc的开源框架。在2005年之前非常流行。
弊端:Struts1的核心控制器就是一个Servlet。随着使用者的增多,弊端开始出现。
Struts2:
- 在long long ago,有一个设计超前的框架XWork,后来推出了XWork1和WebWork2。
- Struts2就是apache和OpenSymphony组织合并开发出来。
- 里面包含了WebWork2的核心及Struts的一些特性和功能。除此之外,和Struts1没有任何关系了。
3,Struts的环境搭建
3.1,下载Struts2的开发包: http://struts.apache.org
3.2,解压后的目录结构(掌握):
apps 官方提供的案例Demo
docs 官方提供的文档
lib 官方提供的jar包,需要用到哪个才导入哪个
src 源码
3.3,struts jar包介绍(了解)
在apps目录中,提供了一个struts2-blank.war (空白包)包,初始学者在项目集成中,导入lib下的所有包即可。
3.4,创建第一个Struts2项目(IDEA)(掌握)
创建Struts2项目:
如果是使用IDEA搭建Struts2项目,则会自动在web.xml中配置Filter。如果是eclipse,则需要手动的将下面代码添加进web.xml,同时还需要把struts2-blank里classes目录下的struts.xml配置文件拷贝到自己创建工程的src中,然后删除struts标签的所有内容,IDEA则会自动完成该步骤。
在web.xml中,配置Filter的代码如下:
<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的规则去处理请求,而不是用以前的servlet去处理。
Tomcat运行Web工程:
如果tomcat运行没有报错,就代表配置成功。但是,在IDEA中,有可能会报下面错误:
[2016-08-31 09:20:10,763] Artifact newClassProject1:war exploded: Error during artifact deployment. See server log for details. [2016-08-31 09:20:10,764] Artifact newClassProject1:war exploded:
com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException:
D:\xxx\xxx\xxx\xxx\out\artifacts\xxx_war_exploded not found for the web module.
解决方案为:
3.5,Struts2的Action配置(配置一个请求的完整流程)(重要)
第一步: 在struts.xml中配置package和action,写如下代码
<struts>
<package name="p1" extends="struts-default" namespace="/user">
<!--
package:表示包
name:包名(唯一性)
extends;继承 固定写法: struts-default
abstract:抽像包,被用与继承,一般不声明action
namespace:命名空间,访问路径,默认值为空字符串(加长路径阶数) action :动作,
name : 相当于Servlet的映射路径
class : 处理请求的类,相当于Servlet类
method: 处理请求的方法 result : 结果,写返回的jsp页面
-->
<!--访问路径-->
<!--http://localhost:8080/day01_structs/user/hello-->
<action name="hello" class="com.gyf.web.action.HelloAction" method="sayHello">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
第二步:写一个HelloAction的类,并需要写个sayHello方法
public class HelloAction {
public String sayHello() throws Exception {
System.out.println("Hello world");
return "success";
}
}
在IDEA中被配置的类会有特殊标识,若出现下图所示的标识,则代表配置成功。
第三步:添加一个success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="utf-8" %>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo1</title>
</head>
<body>
Hello,world!
</body>
</html
第四步:浏览器访问
http://localhost:8080/day01_structs/user/hello 或者:http://localhost:8080/day01_structs/user/hello.action
struts默认是处理.action的请求,或者不带action也可以,其它后缀的都不会拦截,会放行,如jsp
3.6,struts.xml没有标签提示问题(了解)
1,电脑联网,会自动搜索struts的dtd
2,配置本地dtd,打开偏好设置,设置本地的dtd文件
struts-2.3.dtd文件可以从struts2-core-2.3.33.jar包内找到
4,Struts2的执行流程图(了解)
5,Struts2的内部结构(了解)
其中,只有黄色的部分是我们需要写的。
6,Struts2配置文件的加载顺序
6.1,加载时机
当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了。
6.2,加载顺序
6.3,default.properties的一些默认配置
6.4,struts-defaults中默认的拦截器分组
如图,默认的包里有一结果类型,如转发和重定向。
如图,默认情况下,struts会使用defaultStack的拦截器分组。 struts-defualts中主要的内容:结果类型、拦截器分组,默认使用的接替器分组。
6.5,修改struts的访问后缀(了解)
第一种方式:在struts.xml的配置文件中添加下列代码,修改后缀名为.do
<constant name="struts.action.extension" value="do"></constant>
第二种方式: 在src下创建struts.properties,添加struts.action.extension=htm
注意:如果这样配置会覆盖struts.xml的配置。
第三种方式:在web.xml中配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param> </filter>
6.6,配置struts的开发模式(可以显示更多的错误信息)
<!--配置开发模式(显示错误信息更多点)-->
<constant name="struts.devMode" value="false"></constant>
7,Struts配置文件的主要元素讲解(重要)
7.1,package元素
作用: 在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
属性:
namespace详解:
1,namespace的默认取值是一个"",
注意:默认值不是/,写自定义的namespace时需要加/
注意:需要在访问action前添加红色命令空间
2,namespace的查找规则
7.2,action元素
作用:处理动作,处理请求路径。
属性:
name:动作名称
class:动作类名称
method:动作类中的方法名称。默认是public String execute() {}
方法的要求:
1,public 的
2,返回值必须是String
3,没有参数
动作类的第一种写法:
直接写个Action类,不需要继承任何类,然后在struts.xml中配置。
package com.gyf.web.action; public class HelloAction {
public String sayHello() throws Exception {
// int i = 3 / 0;
System.out.println("Hello world");
return "success";
}
}
<package name="p1" extends="struts-default" namespace="/user">
<!--访问路径-->
<!--http://localhost:8080/day01_structs/user/hello-->
<action name="hello" class="com.gyf.web.action.HelloAction" method="sayHello">
<result name="success">/success.jsp</result>
</action>
</package>
动作类的第二种写法:
写个Action类实现Action接口,然后实现execute方法。
public class HelloAction2 implements Action { @Override
public String execute() throws Exception {
return SUCCESS;
}
}
<!--第二种配置方法(默认会访问execute()方法)-->
<action name="login2" class="com.gyf.web.action.HelloAction2">
<result name="success">/success.jsp</result>
</action>
Action接口中,有一些静态常量,如下图:
常量说明:
动作类的第三种写法:(推荐使用的方式)
写个Action类继承ActionSuport类(ActionSupport是实现Action接口的类)
public class HelloAction3 extends ActionSupport { public String login() { return SUCCESS;
} }
<!--第三种,继承ActionSupport-->
<action name="login3" class="com.gyf.web.action.HelloAction3">
<result name="success">/success.jsp</result>
</action>
默认的动作类:
在struts-default.xml中定义了默认动作类和方法。
就是com.opensymphony.xwork2.ActionSupport 这个类。
struts.xml:可以在Action中不配置 class 和method,会由默认的动作类来处理,ActionSupport的excute方法返回的就是success
<!--默认的动作请求,默认的处理类ActionSupport-->
<action name="login4">
<result name="success">/success.jsp</result>
</action>
修改默认的动作类:(一般很少改)
<package name="m1" extends="struts-default" namespace="/god">
<!--更改默认处理的Action-->
<default-class-ref class="com.gyf.web.action.UserAction"></default-class-ref>
</package>
动作访问的通配符:
案例:用户的增删改查
public class UserAction extends ActionSupport {
//添加用户
public String add() {
return SUCCESS;
}
public String delete() {
return SUCCESS;
}
public String update() {
return SUCCESS;
}
public String find() {
return SUCCESS;
}
}
<action name="add" class="com.gyf.web.action.UserAction" method="add">
<result name="success">/add.jsp</result>
</action>
<action name="delete" class="com.gyf.web.action.UserAction" method="delete">
<result name="success">/delete.jsp</result>
</action>
<action name="update" class="com.gyf.web.action.UserAction" method="update">
<result name="success">/update.jsp</result>
</action>
<action name="find" class="com.gyf.web.action.UserAction" method="find">
<result name="success">/find.jsp</result>
</action>
Jsp:所有的jsp页面(4个)简单写上文字
*号通配符优化struts.xml代码
<!--动作访问的通配符/{1}指第一个*号-->
<action name="*" class="com.gyf.web.action.UserAction" method="{1}">
<result name="success">/{1}.jsp</result>
</action>
多个*号通配符:升级版:【很少用】
优先级:绝对匹配优先。使用通配符的按照在配置文件中的先后顺序进行匹配的。
动态方法的调用:(不经常用)
7.2,result元素
作用:为动作指定结果视图
属性:
name:逻辑视图的名称,对应着动作方法的返回值。默认值是success
type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher转发。
result 中 type 的取值:
result中type的取值有四种类型
type的默认取值是dispatcher
type属性的取值在struts-default.xml中定义着
redirect重定向:
chain 转发到同一个名称空间的动作
redirectAction 重定向到同一个名称空间的动作
chain 转发到不同一个名称空间的动作
redirectAction重定向到不同一个名称空间的动作
result元素中param子元素
在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param。
param元素的作用:依赖注入(Dependence Injection)思想
我们通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的。
而param元素就是将配置的参数,注入到该类中。
调用的是对应类的setter方法进行注入的。
<!--result属性-->
<action name="action1" class="com.gyf.web.action.Demo1Action">
<!--type属性-->
<!--
dispatcher:转发到一个页面(jsp),默认值
redirect:重定向到一个页面
chain:转发到action
redirectAction:重定向到另一个action -->
<!--suppress Struts2ModelInspection -->
<!--转发到同一个包下-->
<!--<result name="success" type="chain">action2</result>-->
<!--转发到不同包下-->
<result name="success" type="chain">
<!--依赖注入-->
<param name="namespace">
/n2
</param> <param name="actionName">
action3
</param>
</result>
</action>
自定义结果类型:
其实结果类型就是一个类,这些类都实现com.opensymphony.xwork2.Result接口
或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport。
这些类都有一个doExecute方法,用于执行结果视图。【查看源码各种结果类型的类结构】
struts的内部实现就是Servlet
综上所述自己写一个结果视图
例子:输出CAPTCHA图像的结果类型
CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试)————>简称:验证码。
优化自定义结果类型:
目的:更加灵活的设置验证码的宽度和高度
全局视图和局部视图:
动作类中的servlet api访问:
获取servlet 的api方式:
第一种:通过ServletActionContext获取 【推荐使用】
第二种:通过注入方式:先让Action实现两个接口ServletRequestAware,ServletResponseAware
package com.gyf.web.action; import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware; import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.spi.http.HttpContext; public class TestAction extends ActionSupport implements ServletRequestAware,ServletResponseAware, ServletContextAware { public String test() {
//1,获取servlet的api
//第一种方式,通过ServletActionContext
//1,response
HttpServletResponse response = ServletActionContext.getResponse();
//2,request
HttpServletRequest request = ServletActionContext.getRequest();
//3,session
HttpSession session = request.getSession();
//4,application(ServletContext)
ServletContext application = ServletActionContext.getServletContext(); // none不跳转,也就是不用找result标签
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(application);
return NONE;
} HttpServletResponse response;
HttpServletRequest request;
ServletContext context;
public String test2(){ //1,获取servlet的api
//第二种方式:通过实现接口,让struts自动注入进来
System.out.println(request);
System.out.println(response);
return NONE;
} @Override
public void setServletRequest(HttpServletRequest httpServletRequest) {
this.request = request; } @Override
public void setServletResponse(HttpServletResponse httpServletResponse) { this.response = response;
} @Override
public void setServletContext(ServletContext servletContext) { this.context = context;
}
}
第二种注入方式原理是因为struts有个拦截器
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>来实现的
Struts2框架学习笔记1的更多相关文章
- j2ee开发之struts2框架学习笔记
Struts2框架技术重点笔记 1.Struts2 是在webwork基础上发展而来. 2.Struts2 不依赖struts API和 servlet API 3.Struts2提供了拦截器,表现层 ...
- Struts2框架学习笔记--strtus2初识
struts2概述: 1.struts2框架应用于javaEE三层结构中的Web层框架 2.struts2框架是在struts1和webwork基础之上发展的全新框架(脱胎换骨 ,用法完全不一样)ps ...
- struts2框架学习笔记1:搭建测试
Servlet是线程不安全的,Struts1是基于Servlet的框架 而Struts2是基于Filter的框架,解决了线程安全问题 因此Struts1和Struts2基本没有关系,只是创造者取名问题 ...
- struts2框架学习笔记7:struts2标签
三大标签: 1.JSP:脚本,为了替代servlet,已过时 2.JSTL:标准标签库(core.format.sql.xml),还未淘汰的只有core库 3.Struts2标签库:由Struts2开 ...
- struts2框架学习笔记6:拦截器
拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocati ...
- struts2框架学习笔记5:OGNL表达式
OGNL取值范围分两部分,root.Context两部分 可以放置任何对象作为ROOT,CONTEXT中必须是Map键值对 示例: 准备工作: public void fun1() throws Ex ...
- struts2框架学习笔记4:获取参数
第一种参数获取方式: 编写一个前端页面,提交表单,做示例: <form action="${pageContext.request.contextPath}/Demo1Action&q ...
- struts2框架学习笔记3:获取servletAPI
Struts2存在一个对象ActionContext(本质是Map),可以获得原生的request,response,ServletContext 还可以获得四大域对象(Map),以及param参数( ...
- struts2框架学习笔记2:配置详解
核心配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC ...
随机推荐
- Codeforces Round #575 (Div. 3) D1+D2. RGB Substring (easy version) D2. RGB Substring (hard version) (思维,枚举,前缀和)
D1. RGB Substring (easy version) time limit per test2 seconds memory limit per test256 megabytes inp ...
- Q1:spring-boot中Controller路径无法被访问的问题
在学习spring-boot入门的第一个例子就是spring-boot-web的一个在页面上输出hello-world的例子,在运行这个例子的时候我遇到了下面这个简单的问题,但是第一次解决还是花了我很 ...
- vscode sftp插件的使用
1.在扩展中搜索 sftp 并下载安装: 2.F1调出命令窗口输入 sftp 点击 SFTP:Config : 3.编辑 sftp.json 文件并保存会在当前工程下形成 sftp.json 文件 4 ...
- vue 路由拦截器和请求拦截器
路由拦截器 已路由为导向 router.beforeEach((to,from,next)=>{ if(to.path=='/login' || localStorage.getItem('to ...
- 查看是否安装jdk及路径
JDK能否曾经装置,可以在cmd窗口里输出java -version,假定没有提示出错,就表示曾经装置. JDK的装置途径,可以输出java -verbose,会前往很多信息,其中就包括了JDK的装置 ...
- 在vue中结合render函数渲染指定的组件到容器中
1.demo 项目结构: index.html <!DOCTYPE html> <html> <head> <title>标题</title> ...
- Java网络编程之Netty服务端ChannelOption.SO_BACKLOG配置
ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,函数listen(int socketfd,int backlog)用来初始化服务端可连 ...
- Spark 2.1.1 源码编译
Spark 2.1.1 源码编译 标签(空格分隔): Spark Spark 源码编译 环境准备与起因 由于线上Spark On Yarn Spark Streaming程序在消费kafka 写入HD ...
- js,正则实现金钱格式化
https://blog.csdn.net/qq_36279445/article/details/78889305 https://github.com/jawil/blog/issues/30
- java中的同步和异步
摘自:https://www.cnblogs.com/caotao0918/p/10699785.html 在多线程的环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,它们需要以某种 ...