第一步:创建好maven中的web项目结构是不完整的,我们需要补充完整在src上右击点击Directory后
出现New Directory按住CTRL键选中下面三个后回车,这样第一步就完成了
第二步:点击webapp把里面的index.jsp(删除暂时用不到)再点击WEB-INF中的web.xml
然后
第三步:引入相关依赖
1、引入servlet-api依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
第四步:创建包结构
service和servlet(先用着够用了,之后要把servlet改名字了改成controller)
创建servlet中的类
传统的servlet实现请求接收的响应存在的不足:
1、先继承(extends)HttpServlet 然后重写里面的service方法 一个servlet只能处理一种类型的请求
解决方法:
1.1、重写不同的方法(doGet(你发送get请求就做查询)、doP ost(你发送post请求就做添加)、doPut(发送put请求就做修改)、doDelete(发送delete请求就做删除))发送不同方法做不同的请求
1.2、我们还用了method获取参数,你传什么我就帮你调什么
1.3、再次升级我们通过反射的方式来实现(BaseServlet)
public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置参数的编码格式 解决中文乱码 应该在获取请求参数之前完成 req.setCharacterEncoding("UTF-8"); // 1. 获取方法名 String method = req.getParameter("method"); try { Method declaredMethod = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class); declaredMethod.setAccessible(true); declaredMethod.invoke(this,req,resp); } catch (Exception e) { throw new RuntimeException(e); } } }
2、在接收的时候很繁琐,每获取一个值时都要getParameter 接收参数的类型比较单一 都是String类型 其他类型都需要数据类型转换
3、再转发时有耦合现象,不仅有路径的耦合(就是/page啥的,之后有可能不是了要换路径,维护就会麻烦),还有视图的耦合(.jsp啥玩意的,之后有可能会用html啥的,维护又很麻烦)
如图:
解决办法:
3.1、json格式数据实现前后端数据的交互
之后再项目中可以引入springmvc框架解决以上分析问题
以后就没有servlet层,把servlet层改为Controller层
这张图理解清楚,你的springmvc就已经很牛了,有五大组件,编写的只有一个,剩下四个都是已经编写好的。
核心组件:DispatcherServlet(前端控制器)
第五步:引入springmvc依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency>
依赖具有传递性,引入spring-webmvc之后就会把之前的spring-context依赖中有的也全部引入了就不需要再引了
第六步:把servlet改名为controller,也不需要继承HttpServlet
现在只需要自己做个配置,需要在web.xml(处理请求)中请求映射(DispatcherServlet前端控制器)在web.xml中声明一下
<!-- 请求映射--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> <!-- "/"所有路径全都需要经过dispatcherServlet路径--> </servlet-mapping>
第七步:在resources目录下先创建config再创建spring-mvc的配置文件(我这忘了创建config你们别忘了)
创建好之后点进去
创建完是这样
第八步:在springmvc-config中配置
1)开启包扫描,方便之后通过注解来完成(最好手打,因为要导包)
<context:component-scan base-package="cn.kgc.springmvc.day01"/> <!-- 因为每个层级都有可能要扫描所以最好的选择就是你要扫描所有包的上一个目录层级-->
我们在springmvc-config添加配置,这三个只需要我们去声明一下就好了
处理器映射器:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
处理器适配器:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
视图解析器:
作用:处理handler处理器返回的结果ModeAndView(之后可以不是ModeAndView) model 数据 view 视图名
index之后就不需要再在后面加jsp了,处理了视图的耦合
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- InternalResourceViewResolver中添加配置解析的视图路径--> <property name="prefix" value="/"/><!--前缀--> <property name="suffix" value=".jsp"/><!--后缀--> </bean>
第九步:设计一个查询列表
@Controller public class UserController { //查找 public ModelAndView selectAll(){ return null; } //查一个 public ModelAndView selectOne(){ return null; } //添加 public ModelAndView insert(){ return null; } //修改 public ModelAndView update(){ return null; } //删除 public ModelAndView delete(){ return null; } }
第十步:在webapp中创建jsp文件
在创建好后点击进入main.jsp,在其中用el表达式添加值
第十一步:在servlet中编写代码
问:我后续怎么让请求在项目中找到UserController?
我们通过RequestMapping注解,就是请求映射,你声明的RequestMapping都会被RequestMappingHandlerMapping他所管理
声明请求路劲的映射,如图:
他要我们返回一个ModelAndView,我们就创建一个ModelAndView返回呗,我们设计一个值让他跳到main.jsp中,例:查询一个列表,在ModelAndView中有个方法中有一个addObject我们可以以键值对的方式添加这个值
第十二步:测试
先部署一下tomcat
你配了一个springmvc-config文件但是没有文件能读
没有文件去解析你配置的springmvc-config文件,所以这个任务我们就交给前端控制器(web.xml)点开web.xml再servlet标签中添加init-param标签
在你创建DispatcherServlet的时候,或者接收到请求的时候你得帮我读一下springmvc-config文件,读一下之后才能找到对应的对象
我们还可以设置一下配置初始化的创建时间,我们可以提升servlet创建的时机通过load-on-startup
然后就可以运行了