Servlet Container
HttpServletRequest
HttpServletResponse
HttpServlet
加载阶段:调用无参构造函数实例化Servlet,根据web.xml的信息创建ServletConfig对象
init:将ServletConfig作为参数调用init方法
第一次创建 Servlet对象时调用,在后续每次用户请求时不再调用
单例多线程不安全:当存在不同的会话访问相同的servlet时,新建线程而不会实例化这个servlet对象,即多个线程在共享这个servlet实例以单例的形式存在的!并未使用同步机制,在并发编程下servlet是线程不安全的。
service() :接收到一个 Servlet 请求,在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
下面是该方法的特征:
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
doGet() 方法
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
doPost() 方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
1、Web Client 向Servlet容器(Tomcat)发出Http请求
2、Servlet容器接收Web Client的请求
3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中
4、Servlet容器创建一个HttpResponse对象
5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象
6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据
8、Servlet容器把HttpServlet的响应结果传给Web Client
destroy() :
时机:
1:Tomcat服务器stop
2:web项目reload(长时间未响应)
3:Tomcat容器所在的服务器shutdown
作用:
1:释放JVM不回收的资源(用户自定义)
2:将Servlet移出Servlet Container,等待JVM回收
说明不会立即销毁Servlet,此时如果再调用Servlet是可以调用的
以上阶段所有方法调用都通过反射执行
需要配置文件:
HelloWorld
HelloWorld
HelloWorld
/HelloWorld
< servlet-name> Servlet类名
< servlet-class> servlet 的全限定类名
< servlet-mapping> 用来配置我们注册的组件的访问路径
< url-pattern> 配置这个组件的访问路径
方法:
getParameter()和getParameterValues()获取值
getParameterNames():所有参数的完整列表。在通过paramNames.hasMoreElements(),nextElement()
BS的三层架构:表现层,业务层,持久层
表现层一般是三层架构:MVC
注意这里的MVC是基于WEB的MVC即一种特殊的MVC
1;不像桌面应用的MVC, 这里的Model没法给View 发通知。
2:不像MVP, 这里的Controller 也不会调用View的方法来设置界面。
执行的过程:
前端控制器(核心控制器)DispatcherServlet:用户请求最先达到的控制器,前端控制器调用其他组件处理请求,是MVC架构中的C,是整个流程控制的核心.其存在降低了组件间的耦合性.
处理器映射器HandlerMapping:负责根据用户请求找到处理器.
处理器Handler:具体的业务方法.
处理器适配器HandlAdapter: 对处理器进行执行.这是一种适配器模式的应用.
视图解析器ViewResolver: 负责将处理结果生成视图. ViewResolver首先根据逻辑视图名解析成物理视图名
即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户.
视图View: 具体的页面
在web.xml中配置前端控制器DispatcherServlet:
就是servlet
classpath:springmvc.xml下配置:分别配置处理器映射器,处理器适配器,适配解析器。下图所示的都Java给的API
并且需要配置Handler,也就是给编写的handler类一个用于识别调用的name
编写handler
public class ItemsController1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List itemsList = new ArrayList();
//向list中填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
springmvc.xml:
< mvc:annotation-driven>< /mvc:annotation-driven>
代替处理器映射和处理器适配
handler编写:
@Controller
public class ItemsController3 {
//商品查询列表
//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
//一般建议将url和方法写成一样
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{
处理器适配器
SimpleControllerHandlerAdapter——要求handler实现Contronller接口
HttpRequestHandlerAdapter——要求handler实现HttpRequestHandler接口
@controller
处理器映射器
BeanNameUrlHandlerMapping——根据URL名映射对应的handler
@RequestsMapping,URL映射的方式
视图解析器
InternalResourceViewResolver——JSP解析
DispatcherServlet.properties:默认配置,如果没有配置上述的东西,使用默认的配置
doDispatcher——getHandler返回HandlerExecutionChain——调用handler获得ModelAndView——将Model数据填充到request,视图解析得到View——渲染视图