(一)、Struts第一天

1. JavaWeb知识回顾

n 客户端编程

HTLM/CSS/JS

n XML技术

会写XML

* 基本语法

* DTD

* Schema

会读XML

* Dom4J读取XML

n Servlet/JSP编程

JavaWeb开发,开发web网站!

ServletApi !

几个接口的用法!

面向接口编程!

n 数据库

MySQL数据库!

CRUD语法!

n Jdbc 编程

JdbcApi 接口!

n JavaWeb增强

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

n 最重要的内容,

基于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. D - 小晴天老师系列——晴天的后花园

    D - 小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Oth ...

  2. 神经网络工具箱nntool的使用方法

    关于如何使用nntool神经网络工具箱进行“数据训练”的方法: 1. 在命令窗口键入nntool命令打开神经网络工具箱: 2. 点击Import按钮两次,分别把输入向量和目标输出加入到对应的窗口([I ...

  3. List<string> to List<decimal> by C# 2.0

    List<" } ); List<decimal> temp = data.ConvertAll<decimal>(delegate(string x) { r ...

  4. placeholder改变颜色

    ::-webkit-input-placeholder { /* WebKit browsers */ color: #cfcfcf; } :-moz-placeholder { /* Mozilla ...

  5. Oracle SQL 内置函数大全

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ...

  6. PHP实现中文截取无乱码

    字符串的处理是编程中比较常见的,各种编程语言对字符串的处理也提供了大量函数,像php中mb_substr()函数可以实现对中文字符串的截取,如何使用自定义方法实现中文字符串截取无乱码这也是面试经常遇到 ...

  7. 《JavaScript高级程序设计》读书笔记 ---变量、作用域和内存问题小结

    JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Boolean.Number 和String.基本类型值 ...

  8. 自定义UICollectionView

    1.创建一个UICollectionView工程,点击鼠标右侧按钮选择New File->Cocoa Class->点击Next,Class选项填写一个合理的名称,如:MyCollecti ...

  9. ZOJ 649 Rescue(优先队列+bfs)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. MFC中为菜单或按钮添加快捷键功能

    1.新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL ...