1、三层架构
web层:表现层
作用:负责接收请求参数
展示数据
service层:业务层
作用:完成项目的需求。
处理业务逻辑。
dao层:持久层 Hibernate
作用:对数据库进行增删改查操作的。
dao接口和类
实体类(JavaBean的一种:实体bean。和数据库的表结构一一对应)
2、表现层的模型:MVC
明确:MVC是一个表现层的模型。model2(jsp+servlet+javabean) model1:jsp+javabean
M:Model 模型
在很早以前:表单有自己的bean,FormBean表单bean。它是和表单中的数据一一对应。
作用:封装数据的,用于层和层之间的数据传递。
可以做模型的:
JavaBean(实体Bean和表单Bean)
V:View 视图
作用:用于展示数据的。
可以做视图的:
JSP,HTML
C:Controller [con'trol·ler || -lə] 控制器
作用:用于控制程序流转的。
可以做控制器的:
Servlet:
它是一个运行在服务器端的java小程序,用于接收和响应来自客户端请求,通常使用HTTP协议。
Servlet的生命周期:
出生:请求第一次到达Servlet的时候
活着:只要应用一直提供服务,对象一直存在
死亡:应用卸载或服务器宕机,对象消亡
Servlet是单例模式:
一个应用只有一个Servlet实例。
线程不安全。
Filter:
它可拦截访问web应用中的所有资源。并且进行控制流转。它有一个放行的功能。
Filter的生命周期:
出生:应用一加载对象创建。
活着:只要应用一直提供服务,对象一直存在
死亡:应用卸载或服务器宕机,对象消亡
Filter是单例模式的。
放行:如果有下一个过滤器执行下一个过滤器,如果该过滤器是最后一个,则前往目标资源。
过滤器不是目标资源。
WEB三大组件:Servlet,Filter和Listener全都是单例的。
3、MVC中的控制器:
Servlet和Filter的区别:
1、Servlet是一个目标资源,它可以在浏览器地址栏直接访问。过滤器不是目标资源,不能直接访问。
2、他们都是单例模式,都有一个核心的方法:service,doFilter。
service方法中有两个参数:ServletRequest,ServletResponse
doFilter方法中有三个参数:ServletRequest,ServletResponse,FilterChian
结论:
Servlet能做的,过滤器都能做。因为他们都有请求和响应对象。但是过滤器比Servlet更强大,它不仅可以处理请求和响应,还可以控制程序能否继续执行,它有放行的功能。
如果用过滤器做控制器,就比用Servlet做控制器更好。
3、创建对象的时机不一样。Servlet默认是请求第一次到达。Filter是应用一加载。
4、Struts2框架
概述:
它是一个使用了MVC模型的表现层框架。(注意:它只能干表现层的事)
是用了一个过滤器作为了核心的控制器。
起源:
在2005年之前:apache公司的struts1很流行。(struts1的核心控制器是一个Servlet)
WebWork(XWork)的核心控制器是一个过滤器。
5、搭建开发环境
1、开发包详解
apps:自带的示例
docs:文档
lib:jar包
src:源码
2、搭建步骤:
a、拷贝必备的13个jar包到工程的lib目录中
b、在类的根路径下创建一个名称为struts.xml的文件
c、导入dtd约束
d、在web.xml中配置核心控制器:过滤器
<!-- 配置Struts2的核心过滤器:前端控制器 -->
<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>
e、验证是否搭建成功:
成功的标准:启动tomcat时,没有报异常
6、struts2入门案例
需求:
通过浏览器请求一个地址,访问到struts2提供动作类。
动作类:
就是我们处理请求的类。相当于在我们web阶段综合案例中的各个实现功能的Servlet。
7、入门案例的执行过程
分为2部分:
第一部分:启动tomcat
加载我们的应用——加载应用的web.xml——创建核心控制器(过滤器)——加载struts.xml
第二部分:浏览器发送请求
浏览器发送请求——到达核心控制
——是以.action为后缀,或者没有后缀——进入struts2的核心内部
——不是以.action为后缀——放行了
明确:
动作类是多例的。每个线程自己一个实例。所以不会有线程安全问题。
8、struts2的内部执行图
明确:
在实际开发中我们要做的就是:写动作类,写jsp和写配置文件。
重要:
配置文件是我们学习struts2的重点。
9、Struts2中的配置文件
配置文件的数量:
一共有6个配置文件。
6个配置文件执行时机:
default.properties
它都是key=value的形式。类似于开关。
struts-default.xml
配置的都是struts2的核心。纯struts2核心。
struts-plugin.xml
它是当我们使用了plugin的jar包时才有的配置文件。如果没用插件,就没有。
struts.xml
我们程序中的struts2核心配置。是针对当前项目的核心配置。 推荐的
struts.properties
struts2不仅支持基于xml的配置还可以再使用.properties。但是我们不推荐使用
web.xml
配置的是struts2的一些开关性配置。靠过滤器的初始化参数配置
它最后加载,但是加载的只是和struts2相关的配置。
它会按照上面的顺序逐个加载,如果遇到相同的配置,后加载的覆盖先加载的。
10、Struts常量的配置:
(1)在struts.xml文件中使用<constant> ['kɑnstənt /'kɒn-]标签配置常量
需要指定两个必填的属性name和value
name:该属性指定了常量的常量名
value:该属性指定了常量的常量值
(2)在struts.properties文件中配置常量
struts.properties是一个标准的properties文件,其格式为key-value对,即每一个key对应一个value,key表示的是Struts2框架中的常量,而value则是其常量值:
注意:和struts.xml文件一样,struts.properties文件也应该存放于WEB-INF/classes路径下
(3)在web.xml文件中通过初始化参数配置常量
在web.xml文件中配置核心过滤器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>
11.struts.xml文件的配置
(1)<package>的配置:
package元素详解:
作用:把配置文件按照面向对象的思想来管理。给配置文件创建一个包。
属性:
name:包的名称。必须写,一个应用包名称必须唯一。
extends:指定当前包的父包。子包自动具备父包所定义的内容。它就是面向对象管理配置文件的具体体现。
我们一般都会继承struts-default这个包,该包在struts-default.xml配置文件中定义着。
如果不继承该包,就不能使用struts2的核心功能。
abstract:把当前包声明为抽象包。抽象包一般就是用来被继承的,里面定义的基本都是公共配置。
只有没有action标签的包,才能声明为抽象包。
namespace:指定当前包的名称空间。
它是把访问url按照模块化的方式来管理。
当我们使用了该属性之后,访问URL就变成了:名称空间+动作名称
名称空间的写法: /xxxx /是必须写的
namespace有默认值:默认值是""
(2)配置Action
作用:配置动作名称,动作类和动作方法的对应关系
属性:
name:指定的是动作名称。此处不能写后缀
class:指定的是动作类的类全名
method:指定的是执行的方法名称
动作类的三种创建方式:
第一种:使用无侵入式的创建方式
定义一个普通类即可
此种方式的弊端:失去了一些框架已经实现好的功能
第二种:通过实现Action接口来创建动作类
定义一个普通类实现Action接口即可
默认的动作方法是:Action接口中的execute方法
此种方式的弊端;失去了一些框架已经实现好的功能
SUCCESS:一般多用于执行成功
ERROR:一般多用于动作方法执行产生异常
INPUT:一般多用于数据回显
LOGIN:一般多用于登录
NONE:只用于不返回任何结果的视图。等同于return null;
import com.opensymphony.xwork2.Action;
/**
* 实现Action接口
* @author xiaoqiang
*
*/
public class StrutsDemo02 implements Action{
@Override
public String execute() throws Exception {
System.out.println("StrutsDemo1中的execute执行了。。。");
return SUCCESS;
}
}
第三种:通过继承Action接口的实现类来创建动作类
定义一个普通类,继承ActionSupport
实际开发中推荐的方式。以后我们自己写的动作类都需要继承ActionSupport
默认的动作类和默认的动作方法:
默认的动作类:ActionSupport
默认的动作方法:execute方法
import com.opensymphony.xwork2.ActionSupport;
/**
* 继承ActionSupport类
* @author xiaoqiang
*/
public class StrutsDemo03 extends ActionSupport{
public String show(){
System.out.println("StrutsDemo1中的execute执行了。。。");
return "success";
}
}
(3)result标签详解
作用:根据name属性的取值和动作方法返回值匹配,如果一致,采用type取值的方式,前往指定的页面
属性:
name:和动作方法的返回值匹配。当一致时,就前往指定的页面
其默认值是success
type:采用何种方式前往。——请求转发和重定向
type属性常用取值:
dispatcher [dɪ'spætʃə]:请求转发,默认值
redirect:重定向(它可以实现redirectAction的功能) [rɪːdɪ'rekt]
redirectAction:重定向到另一个动作
12.访问Action的方式:
(1)一个动作配置一个action 掌握
最普通的:
(2)使用一个通配符来配置
(3)使用多个通配符来配置 掌握
(4)使用动态方法调用 了解
13、访问ServletAPI:
使用的是ServletActionContext对象中的静态方法
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSessoin();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();