(一)、Struts第一天

1. JavaWeb知识回顾

客户端编程

HTLM/CSS/JS

XML技术

会写XML

* 基本语法

* DTD

* Schema

会读XML

* Dom4J读取XML

Servlet/JSP编程

JavaWeb开发,开发web网站!

ServletApi !

几个接口的用法!

面向接口编程!

数据库

MySQL数据库!

CRUD语法!

Jdbc 编程

JdbcApi 接口!

JavaWeb增强

过滤器、Listener、文件上传&下载、国际化、邮件!

最重要的内容,

基于MVC模式的开发!

熟练写出CRUD案例!

目标:

自定义一个基于MVC模式的通用程序

Struts2框架

2. 自定义一个基于MVC模式的通用程序

目标:项目中只要一个Servlet!处理所有请求!  (或者,只要一个过滤器!)

1) MVC模式

Model    模型     (bean/dao/service)

View     视图     (jsp)

Control   控制器   (servlet)

总结:

Servlet充当控制器!

1. 获取请求数据封装

2. 调用Service,处理业务逻辑操作

3. 响应

2) 分析

3) 实现

步骤:

login.jsp              登陆页面

register.jsp            注册页面

UserService           处理登陆、注册的业务逻辑类 (tom/888)

LoginServlet.java

RegisterServlet.java

规则:

登陆成功,首页!(index.jsp)

注册成功,

--àlogin.jsp

--à首页!  (注册成功,改为跳转到首页,不用改代码!怎么做?)

优化:

1. 给Servlet写一个助手类,分担servlet中业务操作

一个Servlet,对应一个Action类!

完整实现:(代码学员补充:)

总结:

基于MVC模式的应用程序!(小应用框架!)

有很多种写法,且每个人写的程序都不一样!不利于项目团队合作!

--à

规范开发: 基于MVC模式的开发!

(apache提供了Struts组件,简化mvc模式的项目开发!)

3. Hello Struts!

Struts版本:2.3

开发步骤:

ü 下载组件,引入jar

www.apache.org  官网

8个

ü 配置web.xml

<!-- 配置Struts核心过滤器 -->

<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>

ü 写Action

// 写Action

public class HelloAction{

// 处理请求代码!

public String execute() {

System.out.println("HelloAction.execute()");

return "success";

}

public String add() {

System.out.println("HelloAction.add()");

return "add";

}

}

ü 配置Action

配置路径:src/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="test1234" extends="struts-default">

<!-- action: 配置访问路径与处理action类的映射关系! -->

<action name="hello" class="cn.itcast.action.HelloAction" method="execute">

<result name="success">/index.jsp</result>

</action>

<!-- http://localhost:8080/day27_struts01/add -->

<!-- http://localhost:8080/day27_struts01/add.action -->

<action name="add" class="cn.itcast.action.HelloAction" method="add">

<result name="add">/add.jsp</result>

</action>

</package>

</struts>

4. Struts框架

框架

框架,软件的半成品,项目开发,可以在框架基础上进行,提高开发效率!

框架,

都会预先实现一些通用功能,使用框架直接应用这些通用功能而不用重新实现!

框架在项目分层中作用:

Struts2框架

ü 概念

基于MVC模式的应用层框架技术!

Struts2主要是通过Action动作类,处理请求!

(与传统的servlet开发相比,只需要写Action类即可!用Action取代之前的servlet开发!)

(Struts是对servletApi进行的封装!)

Struts2功能的引入,

是通过核心过滤器完成的!

如果想用struts的任何功能,必须经过核心过滤器!(被过滤器拦截!)

(struts提供的标签的访问,要先经过核心过滤器!)

ü Struts2的发展

Struts2=Struts1 + xwork

源码分类:

org.apache.struts2                 struts2核心包

com.opensymphony.xwork2          xwork核心包

学习版本: Strtus2.3

公用组件学习方式:

1.  下载组件源码,项目中引入jar文件!

2.   配置

3.   Api

ü 搭建struts环境

步骤:

1. 引入jar包

struts2-core-2.3.4.1.jar                    struts核心功能

xwork-core-2.3.4.1.jar                     webwork核心功能

ognl-3.0.5.jar                            Ognl表达式语言支持

commons-fileupload-1.2.2.jar               struts对文件上传的支持

commons-io-2.0.1.jar

commons-lang3-3.1.jar                   对java.lang包的扩展!

freemarker-2.3.19.jar                    标签库模板

javassist-3.11.0.GA.jar                    struts对字节码处理!

2. web.xml配置核心过滤器

核心过滤器:StrutsPrepareAndExecuteFilter

方式:

ctrl + shift   +  R   查看工程中的源码

ctrl + shift   +  T   查看jar文件中的源码!

3. 写Action类

Struts提供了一些功能,方便开发!

例如:文件上传、请求数据封装!

封装请求数据,方式1:

Register.jsp

<body>

<form action="${pageContext.request.contextPath }/register.action" method="post">

注册用户:<input type="text" name="userName">  <br/>

注册密码:<input type="text" name="pwd">  <br/>

<input type="submit" value="注册!">

</form>

</body>

RegisterAction

public class UserAction extends ActionSupport {

// 封装请求数据,方式1:

private String userName;

// request.getParameter(“userName”)

// 把值作为方法参数传入!

public void setUserName(String userName) {

this.userName = userName;

}

private String pwd;

public void setPwd(String pwd) {

this.pwd = pwd;

}

@Override

public String execute() {

System.out.println(userName + "\t" + pwd);

return "success";

}

}

封装请求数据,方式2:

注册用户:<input type="text" name="user.userName">  <br/>

注册密码:<input type="text" name="user.pwd">  <br/>

public class UserAction extends ActionSupport {

// 封装请求数据,

private User user;

public void setUser(User user) {

this.user = user;

}

// 注意:如果是基本类型只用给set方法即可;  如果是对象,必须给set和get!

public User getUser() {

return user;

}

}

4. 配置struts.xml, 配置action!

访问:

1. struts2默认访问后缀是.action最为后缀

2. 默认执行的方法是execute!

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>

<!--

1. package   包

作用: 管理action或管理路径的作用!

name

表示包名称! 作用,被其他包继承!

<package name="base" extends="struts-default"></package>

<package name="config" extends="base">

包名不能重复!

extends

当前包表必须继承struts-default包!

(struts-default.xml 中定义了这个包!)

abstract="true"

抽象包中不能有action配置!主要被其他包继承的!

namespace

名称空间,管理路径!作为路径的一部分!

默认值:/

访问路径 = namespace  + actionName

举例:http://localhost:8080/day27_struts01/user/update.action

路径匹配原则:

http://localhost:8080/day27_struts01/user/a/b/c/update.action   OK

http://localhost:8080/day27_struts01/user/a/b/update.action     OK

http://localhost:8080/day27_struts01/user/a/update.action       OK

http://localhost:8080/day27_struts01/user/update.action         OK

http://localhost:8080/day27_struts01/a/user/update.action       NOK

总结:

localhost  本机IP

8080       Tomcat

/day27_struts01   通常是%tomcat%/webapps下部署项目名称!

struts获取:

/user/a/b/c/update.action

截取得到:

/user/a/b/c    名称空间部分

去这个名称空间找action name 是"update" 的路径,没有,就向上一级目录查找

/user/a/b     去这个名称找,没有"update", 向上一层找

/user/a       没有

/user         有则返回(不往下查找!)    ; 如果没有,去默认名称空间找

/             没有找到,则404!

2. action 节点

作用: 配置访问路径,与,处理action类的映射关系!

name

与名称空间共同组成访问路径!

class

处理action类的全名!

method

当前请求的处理方法!

如果不写,默认是execute!

result 子节点

作用: action类的业务处理方法的返回的跳转标记,与跳转页面的映射关系!

name

action类中方法返回的String

type

表示跳转的类型! (可写值的定义,在struts-default.xml中!)

默认是:dispatcher, 为转发!

dispacher  默认值; 转发

redirect   重定向

标签体中可以指定跳转的页面!

-->

<package name="config" namespace="/user" extends="struts-default">

<!-- 配置Action -->

<action name="user" class="cn.itcast.b_config.UserAction" method="execute">

<result name="success" type="redirect">/index.jsp</result>

</action>

</package>

</struts>

Struts2执行流程

思考:

Servlet类是单例还是多例? Action类?

à servlet单例

-à struts2的action是多例!

Struts1的处理请求的类是单例!struts1默认访问后缀是*.do

执行流程:

Tomcat服务器启动:

过滤器:init()/doFilter()/destroy()

1. 服务器启动,加载服务器自身的web.xml

2. 同时加载部署到tomcat服务器的所有项目的web.xml

3. 创建项目中配置的核心过滤器对象:StrutsPrepareAndExecuteFilter

4. 执行过滤器初始化方法:init(..)

加载下面几个配置文件:

struts-default.xml,

1. bean节点定义

Struts在运行时候需要创建的关键对象,都再这里定义!

2. package  默认的包的定义(struts-default)

a. 跳转的结果类型

chain            2. 转发到action

dispatcher        1. 转发到jsp

redirect          3.  重定向到jsp

redirectAction     4.  重定向到 action

stream 返回的结果是流!(文件下载!)

转发

1. 转发到jsp

2. 转发到servlet

重定向

3.  重定向到jsp

4.  重定向到 servlet

b. 所有的拦截器的定义

struts2把一个的功能实现,通过一个个拦截器完成!

用户使用哪写功能,自由组装拦截器即可!

如果没有指定,

执行默认的拦截器,有18个!

默认的拦截器栈:defaultStack

c. 默认执行的拦截器栈、默认执行的action类

struts-plugin.xml,

插件配置!

struts.xml

用户配置!

用户访问:

5. 执行过滤器的doFilter()方法

6. 创建Action对象

7. 再执行“拦截器“

8. 再执行action的业务方法,如execute方法!

Struts2数据处理

Servlet开发:

--àhttp请求,访问servlet

--à 调用Service

-à 调用dao

--à service调用的结果,保存到域中

---à 响应

-à jsp中取出域中数据!

Action开发:

Action-àService-àdao

Action保存结果!

/**

* 数据保存到域?

* |-- ActionContext

*  |-- ServletActionContext

*/

public String execute() throws Exception {

// 方式1:获取原始的ServletApi, 把数据保存到域!

HttpServletRequest request = ServletActionContext.getRequest();

HttpSession session =  request.getSession();

ServletContext sc = ServletActionContext.getServletContext();

// 保存

request.setAttribute("data", "request_data");

session.setAttribute("data", "session_data");

sc.setAttribute("data", "application_data");

return "success";

}

// 方式2: 通过ActionContext操作

// 注意:struts把request/session/application这些域对象,

// 封装为一个个的map,我们就可以通过操作map来操作域对象!

public String execute() throws Exception {

// 获取ActionContext对象

ActionContext ac = ActionContext.getContext();

// 获取表示request的map

//Map<String,Object> request = (Map<String, Object>) ac.get("request");

Map<String,Object> request = ac.getContextMap();

// 获取表示session的map

//Map<String,Object> session = (Map<String, Object>) ac.get("session");

Map<String,Object> session =  ac.getSession();

// 获取表示application的map

//Map<String,Object> application = (Map<String, Object>) ac.get("application");

Map<String,Object> application = ac.getApplication();

// 放数据到“域对象”

request.put("data", "request_data11");

session.put("data", "session_data21");

application.put("data", "application_data31");

return "success";

}

总结:

项目中尽量使用解耦的方式操作数据:ActionContext!

当ActionContext 满足不了需求,再用ServletActionContext!

(一)、Struts第一天的更多相关文章

  1. Struts 第一天

    请简述下Struts2 的执行流程. 首先是,启动tomcat服务器,这时候会加载web.xml,当读到filter标签时,会创建过滤器对象.struts2的核心过滤器(StrutsPrepareAn ...

  2. Struts第一个案例搭建

    1.引入依赖 <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</art ...

  3. Struts第一个程序。

    1:创建完程序后.先写web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmln ...

  4. struts入门初步(一)

      struts2.0与struts1.0运用了不同的框架,有一定的不兼容性. struts2.0借鉴了webwork的框架思想. Struts2的基本步骤: 1.拷贝struts的jar到项目中(导 ...

  5. Struts1.X与Spring集成——第一种方案

    spring+struts(第一种方案) 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象,调用业务逻辑方法. 一,新建一个项目Spring_Strut ...

  6. <转> jsp页面向action传值的方法(最后一种简单)

    多的不说,直接上代码; struts.xml代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  7. struts2前后台传值的三种方法

    原文地址: http://laokaddk.blog.51cto.com/368606/1340816 多的不说,直接上代码; struts.xml代码: <?xml version=" ...

  8. Java框架 面试题总结

    一. Struts1.x 4 1. struts1优缺点,为什么要使用struts1 4 2. Struts1核心组件 4 3. Strust1请求处理流程  工作原理 4 4. Struts1线程安 ...

  9. 刚開始学习的人非常有用:struts2中将jsp数据传到action的几种方式

    先给上struts.xml代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE strut ...

随机推荐

  1. 【Echarts每天一例】-1

    官方网址:http://echarts.baidu.com/doc/example/line1.html 使用百度echarts官方实例:http://ask.csdn.net/questions/1 ...

  2. 第一题 (Map)利用Map,完成下面的功能:

    从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯.  附:世界杯冠军以及对应的夺冠年份,请参考本章附录. 附录  1.历届世界杯冠 ...

  3. UIScrollView 加载多个view view还可以交换顺序(1)

    #import "ViewController.h" #define kWidthOfScreen self.view.frame.size.width #define kHeig ...

  4. Meta标签中的属性及含义

    一.Meta标签中的format-detection属性及含义 format-detection翻译成中文的意思是“格式检测”,顾名思义,它是用来检测html里的一些格式的,那关于meta的forma ...

  5. Neutron 不健全的HA ROUTER

    首先介绍下HA,所谓的HA就是高可用性,但HA有双主.主备两种工作模式,其中主备模式又包含抢占与 非抢占两种方式,而Neutron Router采用的无疑是HA中最简单的工作方式非抢占主备模式. HA ...

  6. 创建mysql数据表成功

    create table picindex(id int NOT NULL AUTO_INCREMENT,userName varchar(255) NOT NULL,cur int(11) NOT ...

  7. HDU1007--Quoit Design(平面最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  8. iOS可变字符串的所有操作

    可直接把代码复制即可结合输出看结果加深记忆 //创建一个可变字符串 NSMutableString * ms1 = [[NSMutableString alloc]init]; //可以通过类方法来创 ...

  9. PHP常用函数之数组篇

    分类:数组分为索引数组和关联数组.索引数组既是指的我们的数组下表为阿拉伯数字,关联数组则是非阿拉伯数字. 定义: 5.4版本之前 $arr = array('name' => '张三', 'ag ...

  10. Git add和commit步骤分析

    修改后或者添加新的文件,执行add命令后,首先它会先存入本地库的暂存区, add可以上传很多个文件,然后执行commit命令后,都会被提交到默认的分支 Master分支上.只有文件更改和文件新建,都可 ...