(一)、Struts第一天
(一)、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
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!