-
1.今日任务
-
1.自定义MVC框架
-
1.具体操作
- 1.需求介绍
-
2.struts.xml
- 目的:帮助我们根据客户的请求路径找到要处理的对象和方法及返回的页面
- <?xml version="1.0" encoding="UTF-8"?>
<struts>
<action name="mc" class="com.hd.controller.McController">
<result name="list" type="redirect" >/jstl/mclist.jsp</result>
<result name="add" type="dispacher">/jstl/mc.jsp</result>
</action>
<action name="user" class="com.hd.controller.UserController">
<result name="list" type="redirect" >/jstl/userlist.jsp</result>
<result name="add" type="dispacher">/jstl/user.jsp</result>
</action>
</struts>
-
3.根据struts.xml创建相关的类
- ActionModel
- package com.hd.model;
import java.util.HashMap;
import java.util.Map;
/**
* Model ActionModel
* @author dpb
*
*/
public class ActionModel {
// 客户端请求的地址
private String name;
// 客户端处理对应的类路径
private String classes;
// 处理后对应的结果集
private Map<String,ResultModel> results = new HashMap<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClasses() {
return classes;
}
public void setClasses(String classes) {
this.classes = classes;
}
public Map<String, ResultModel> getResults() {
return results;
}
public void setResults(Map<String, ResultModel> results) {
this.results = results;
}
}
- ResultModel
- package com.hd.model;
/**
* model ResultModel(调用方法的返回信息)
* @author dpb
*
*/
public class ResultModel {
// 调用方法返回的字符串
private String name;
// 跳转的方式重定向或者请求转发
private String type;
// 要跳转的路径
private String path;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
-
4.创建解析struts.xml的工具类
- 导入dom4j的jar包
- dom4j-1.6.1.jar
- ActionMapppingManager
- 成员变量
- public Map<String,ActionModel> mappings = new HashMap<>();
- init方法
- // 1.获取到struts.xml文件的路径
String path = ActionMappingManager.class.getResource("/struts.xml").getPath();
// 2.获取SAXReader对象,解析struts.xml
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(path);
// 3.获取根节点
Element root = doc.getRootElement();
// 4.获取相关的子节点action
List<Element> list = root.elements();
for (Element ele : list) {
ActionModel action = new ActionModel();
String actionName = ele.attributeValue("name");
String actionClass = ele.attributeValue("class");
// 获取action下的所有的子节点
List<Element> resultList = ele.elements();
Map<String,ResultModel> results = new HashMap<>();
for (Element resultEle : resultList) {
String resultName = resultEle.attributeValue("name");
String resultType = resultEle.attributeValue("type");
String resultPath = resultEle.getTextTrim();
// 将获取的子节点的信息保存到ResultModel对象中
ResultModel result = new ResultModel(resultName,resultType,resultPath);
results.put(resultName, result);
}
// 将每个action的属性和子节点内容保存到action对象中
action.setName(actionName);
action.setClasses(actionClass);
action.setResults(results);
// 将每个action的内容保存到map集合中
mappings.put(actionName, action);
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
- getActionMapping
- /**
* 根据actionName获取解析的对应的action节点内容
* @param actionName
* @return
*/
public ActionModel getActionMapping(String actionName ){
return mappings.get(actionName);
}
-
5.创建中央控制器Servlet
- 1.init()初始化解析xml文件
- ActionMappingManager amm ;
/**
* 初始化解析xml文件
*/
public void init(ServletConfig config) throws ServletException {
amm = new ActionMappingManager();
amm.init();
}
- 2.具体处理
- // 1.获取请求的地址 http://localhost:8081/shop/mc_add
// request.getRequestURI();--> shop/mc_add
String basePath = request.getRequestURI();
// 2.获取地址中最后一个'/'的位置
int opt = basePath.lastIndexOf("/");
// 3.截取字符串
String path = basePath.substring(opt+1);
// 4.拆分,根据'_'拆分
String[] strArray = path.split("_");
String actionName = strArray[0];
String actionMethod = strArray[1];
// 5.根据actionName获取对应的actionModel
ActionModel actionModel = amm.getActionMapping(actionName);
// 6.获取请求对应的class路径
String actionClass = actionModel.getClasses();
try {
// 7.根据反射机制获取对应的实例
Object obj = Class.forName(actionClass).newInstance();
// 8.获取对应的方法
Method method = obj.getClass().getMethod(actionMethod);
// 9.执行对应的方法并获取结果
String resultName = (String) method.invoke(obj);
// 10.根据结果做出相应的跳转
ResultModel resultModel = actionModel.getResults().get(resultName);
// 11.获取跳转的类型
String type = resultModel.getType();
if("redirect".equals(type)){
// 重定向
response.sendRedirect(request.getContextPath()+resultModel.getPath());
}else{
// 请求转发
request.getRequestDispatcher(resultModel.getPath()).forward(request, response);
}
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
-
2.导出jar包公共使用
- 子主题 1
- 子主题 2
-
2.struts2基础
-
1.Web常用开发工具
- 记事本
- eclipse
- MyEclipse
- intellj idea
- 2.MyEclipse中集成jdk和Tomcat
-
3.web开发三层框架
-
展现层(mvc层)
- Jsp + servlet
- Struts2
- JSF
- Springmvc
- Tapestry
- webwork
-
业务逻辑层(service、business)
- service
-
数据访问层(dao层)
- JDBC
-
4.struts2介绍
- 1.发展历史
-
2.开发步骤
- 1.导入相关jar包
- commons-beanutils-1.9.2.jar
- commons-fileupload-1.3.1.jar
- commons-io-2.4.jar
- commons-lang3-3.4.jar
- commons-logging-1.1.3.jar
- freemarker-2.3.23.jar
- javassist-3.20.0-GA.jar
- log4j-api-2.5.jar
- ognl-3.1.4.jar
- struts2-core-2.5.jar
-
3.struts2的配置
- 1.在src下创建struts.xml文件
- dtd标记
- 一套关于标记符的语法规则
- 2.在web.xml文件中加入过滤器
- <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 3.创建一个UserAction
- public class UserAction {
public String save(){
System.out.println("save。。。。");
return "list";
}
public String delete(){
System.out.println("delete。。。。");
return "list";
}
}
- 4.struts.xml配置
- <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="myPack" extends="struts-default" namespace="/">
<action name="userDelete" class="com.hd.controller.UserAction" method="delete">
<result name="list" >/jsp/userlist.jsp</result>
</action>
<action name="userSave" class="com.hd.controller.UserAction" method="save">
<result name="list" >/jsp/userlist.jsp</result>
</action>
</package>
</struts>
-
4.struts.xml标记介绍
- package
- name
- 包名不能一样,是唯一的
- namespace
- 表示命名空间,相同的命名空间下的Action的名字要不一样
- extends
- 继承
- 一定要继承struts-default
- action
- name
- action的名字,在同一个包下不能重复,是唯一的
- class
- 类路径
- method
- 要调用的方法名
- result
- name
- 匹配方法返回回来的结果字符串
- type
- 表示跳转方式
- chain
- 请求链路
- dispatcher
- 请求转发
- 默认是请求转发
- redirect
- 重定向
- redirectAction
- 重定向到一个aciont后缀的地址
- stream
- 流,文件下载时会用到
- include
- 引入另一个配置文件
- <include file="struts-order.xml"></include>
- constant
- 常量的配置
- 常用的常量配置
- 编码的配置
- <constant name="struts.i18n.encoding" value="utf-8"></constant>
- 配置后缀名
- <constant name="struts.action.extension" value="action,do,hd,,"></constant>
- 自动刷新
- <constant name="struts.configuration.xml.reload" value="true"></constant>
-
2.作业
- 1.完成一个自定义的MVC框架,dom4j和反射
- 2.自己搭建一个struts2框架
- 3.看两章的ppt预习