(一)、Struts第一天

(一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 + " " + 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方法即可;  如果是对象,必须给setget!

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

-à struts2action是多例!

 

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

// 注意:strutsrequest/session/application这些域对象,

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

public String execute() throws Exception {

// 获取ActionContext对象

ActionContext ac = ActionContext.getContext();

// 获取表示requestmap

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

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

// 获取表示sessionmap

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

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

// 获取表示applicationmap

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





原文地址:https://www.cnblogs.com/dantefung/p/4830556.html