package com.tch.edu.mvcframework.servlet;
import com.tch.edu.mvcframework.annotations.*;
import com.tch.edu.mvcframework.pojo.Handler;
import com.tch.edu.mvcframework.annotations.*;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 自定义前段控制器
*/
public class MyDispatcherServlet extends HttpServlet {
//配置文件信息
private Properties properties = new Properties();
//缓存扫描到的类的全限定类名
private List<String> classNames = new ArrayList<>();
//IOC容器
private Map<String,Object> ioc = new HashMap<String,Object>();
//hanlerMapping
//存储URL和method之间映射
//private Map<String,Method> handlerMapping = new HashMap<>();
private List<Handler> handlerMapping = new ArrayList<>();
@Override
public void init(ServletConfig config) throws ServletException {
//1. 加载配置文件 springmvc.properties
String contextConfigLocation = config.getInitParameter("contextConfigLocation");
//解析配置文件
doLoadConfig(contextConfigLocation);
//2. 扫描注解
doScan(properties.getProperty("scanPackage"));
//3. 初始化Bean
doInstance();
//4. 依赖注入
doAutoWired();
//5. 构造一个HandlerMapping处理器映射器,讲配置好的url和method建立映射关系
initHandlerMapping();
System.out.println("MVC 初始化完成....");
}
//构造一个HandlerMapping处理器映射器,讲配置好的url和method建立映射关系
/**
* 最关键的环节:建立URL映射关系
*/
private void initHandlerMapping() {
if(ioc.size() == 0) return;
for(Map.Entry<String,Object> entry:ioc.entrySet()){
Class<?> aClass = entry.getValue().getClass();
if (!aClass.isAnnotationPresent(MyController.class)){
//非Controller不处理
continue;
}
String baseUrl = "";
//是mapping映射
//获取Controller上的注解值
if (aClass.isAnnotationPresent(MyRequestMapping.class)){
MyRequestMapping myRequestMapping = aClass.getAnnotation(MyRequestMapping.class);
baseUrl = myRequestMapping.value();
}
Method[] methods = aClass.getMethods();
for (int i = 0; i < methods.length; i++) {
//获取所有方法
Method method = methods[i];
//非MyRequestMapping不处理
if (!method.isAnnotationPresent(MyRequestMapping.class)){continue;}
//获取方法上的mpping
MyRequestMapping mapping = method.getAnnotation(MyRequestMapping.class);
//方法上的注解
String method_anno = mapping.value();
//建立url和方法直接的映射
String url = baseUrl + method_anno;
//处理handler对象
Handler handler = new Handler(entry.getValue(),method, Pattern.compile(url));
//获取方法的参数列表
Parameter[] parameters = method.getParameters();
for (int j = 0; j < parameters.length; j++) {
Parameter parameter = parameters[j];
//判断是否是HttpServletRequest或者HttpServletResponse
if (parameter.getType() == HttpServletRequest.class || parameter.getType() == HttpServletResponse.class){
handler.getParamIndexMapping().put(parameter.getType().getSimpleName(),j);
}else {
handler.getParamIndexMapping().put(parameter.getName(),j);
}
}
//判断方法是否有校验
if (method.isAnnotationPresent(MySecurity.class)){
//获取方法的权限
MySecurity mySecurity = method.getAnnotation(MySecurity.class);
//获取方法上的校验值
String[] value = mySecurity.value();
List<String> listvalue = Arrays.asList(value);
List arrList = new ArrayList(listvalue);
//获取类上的校验值
if (aClass.isAnnotationPresent(MySecurity.class)){
MySecurity mySecurityMethod = aClass.getAnnotation(MySecurity.class);
String[] classMySecurity = mySecurityMethod.value();
for (String s : classMySecurity) {
if(!arrList.contains(s)){
try {
//添加到校验集合
arrList.add(s);
}catch (Exception e){
e.getStackTrace();
}
}
}
}
//村粗
handler.setSecurity(arrList);
}
//存入映射容器
handlerMapping.add(handler);
}
}
}
//依赖注入
private void doAutoWired() {
//无对象
if(ioc.size() == 0) return;
//遍历容器的对象
for(Map.Entry<String,Object> entry:ioc.entrySet()){
//获取所有字段信息
Field[] declaredFields = entry.getValue().getClass().getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field declaredField = declaredFields[i];
//判断是否有Autowired
if (!declaredField.isAnnotationPresent(MyAutowired.class)){
return;
}
MyAutowired myAutowired = declaredField.getAnnotation(MyAutowired.class);
//获取注解的ID
String beanName = myAutowired.value();
if("".equals(beanName.trim())){
//没有配置具体的bean id,那就需要根据当前的字段类型注入(接口注入)
beanName = declaredField.getType().getName();
}
//暴力访问
declaredField.setAccessible(true);
try {
//注入赋值
declaredField.set(entry.getValue(),ioc.get(beanName));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
//初始化Bean对象(实现IOC容器),使用反射技术完成对象的创建和管理
private void doInstance() {
if (classNames.size() == 0) return;
for (int i = 0; i < classNames.size(); i++) {
String className = classNames.get(i);
try {
//反射
Class<?> aClass = Class.forName(className);
//区分controller、service
if(aClass.isAnnotationPresent(MyController.class)){
//类名
String simpleName = aClass.getSimpleName(); //DemoController
String loweFirstSimpleName = loweFirst(si
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
作业一: 手写MVC框架基础上增加如下功能 1)定义注解@Security(有value属性,接收String数组),该注解用于添加在Controller类或者Handler方法上,表明哪些用户拥有访问该Handler方法的权限(注解配置用户名) 2)访问Handler时,用户名直接以参数名username紧跟在请求的url后面即可,比如http://localhost:8080/demo/handle01?username=zhangsan 3)程序要进行验证,有访问权限则放行,没有访问权限在页面上输出 注意:自己造几个用户以及url,上交作业时,文档提供哪个用户有哪个url的访问权限 作业二: 需求:实现登录页面(简易版即可),实现登录验证功能、登录之后跳转到列表页,查询出 tb_resume 表【表数据和课上保持一致】的所有数据(列表不要求分页,在列表右上方有“新增”按钮,每一行后面有“编辑”和“删除”按钮,并实现功能),如果未登录就访问url则跳转到登录页面,用户名和密码固定为admin/admin 技术要求:根据SSM整合的思路,进行SSS整合(Spring+SpringMVC+SpringDataJPA),登录验证使用SpringMVC拦截器实现 【提交时统一数据库名test,用户名和密码root】
资源推荐
资源详情
资源评论














收起资源包目录





































































































共 152 条
- 1
- 2
资源评论


hankham
- 粉丝: 0
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 浅析网络环境下开展区域性校本培训的主要任务.doc
- 国家开放大学电大《教育学》网络课形考任务1作业及答案.docx
- 企业软件定制开发解决方案(20211215112015).pdf
- 交通行业招投标信息化解决方案研究.doc
- 用友财务软件操作流程处理.doc
- 智慧城市建设调研提纲.doc
- 开启“互联网”模式助力安全生产监管.docx
- 计算机说明文-[基于计算机的插图工具对科学说明文的意义建构的影响]-.doc
- 开题报告杨毅敏基于单片机的多参数实时数据采集系统设计.doc
- 服装行业网络营销分析6.docx
- 2023年华中科技大学研究生入学考试计算机网络试题.doc
- 饭店计算机信息管理第章饭店信息化建设及其案例分析.ppt
- 区块链技术的调研综述报告样本.doc
- 企业信息化规划过程分解与应用.doc
- 建设工程项目管理教案.doc
- 学生成绩管理系统代码(c语言编写).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
