目录
1.Servlet生命周期:实例化、初始化、职务、销毁
1)Servlet初始化
a.有参 public void init(ServletConfig config) throws ServletException{}
b.无参 public void init() throws ServletException{}
注:如果在初始化时需要进行一些操作(准备工作),则需要重写init()方法
通过如下步骤获取初始化的数据:
a..获取config对象
ServletConfig config = getServletConfig();
b.获取初始化参数值
config.getInitParameter(key);
2)配置方法
a.在web.xml中配置Servlet
<servlet>
<servlet-name>Demon01Servlet</servlet-name>
<servlet-class>com.xx.Servlet.Demon01Servlet</servlet-class>
<init-param>
<param-name>hello</param-name>
<param-value>world</param-value> <!--前缀-->
</init-param>
<init-param>
<param-name>uname</param-name>
<param-value>jim</param-value> <!--前缀-->
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Demon01Servlet</servlet-name>
<url-pattern>/demon01</url-pattern>
</servlet-mapping>
b. 可以通过注解的方式进行配置
@WebServlet(urlPatterns = {"/demon01"},
initParams = {
@WebInitParam(name="hello",value = "world"),
@WebInitParam(name="uname",value = "jim")
}
)
注:两种配置方式只可存在一种
2.Servlet中的ServletContext和<context-param>
1)获取ServletContext
a.在初始化方式中:
ServletContext servletContext = getServletContext();
b.在服务方法中通过request对象获取:
req.getServletContext();
c.在在服务方法中通过session获取:
req.getSession().getServletContext();
2)获取初始化值
servletContext.getInitParameter();
3.业务层
Model1和Model2
View(视图): 用于做数据展示以及和用户交互的界面
Controller(控制器): 接受客户请求,具体的业务功能需要借助Model来实现
MVC: Model(模型):分为很多种: pojo/vo(value object)、业务模型组件、 数据访问层组件
a.pojo/vo: Fruit对象、属性私有的参数、get/set方法来作为数据载体
b.DAO: 数据访问对象
c.BO: 业务对象(business object)
区分业务对象和数据访问对象:
a.DAO中的方法都是单精度方法 单精度:一个方法只进行一个操作。比如添加(insert)、查询(selete)...
b.BO中的方法属于业务方法,而实际的业务是复杂的,因此业方法的粒度是较粗的
如:注册-->业务功能,则注册方法即为业务方法,这个业务方法中包含多个DAO方法。即注册的业务功能需要通过多个DAO方法的组合调用,从而实现注册功能
注册:
i.检查用户名是否被注册 --> DAO中的select操作
ii.向用户表新增 -->DAO中的insert操作
iii.向用户积分表新增一条记录(新用户默认初始化积分100分) -->DAO中的insert操作
iv.向系统消息表新增一条记录(如:新用户注册,根据用户通讯录向他的联系人推送消息) -->DAO中的insert操作
v.向系统日志表新增一条记录(如:用户处于某IP地址时,在某年某月某日某时某分某秒注册) -->DAO中的insert操作
4.IOC
1)耦合/依赖
在软件系统中,层与层之间存在依赖(耦合)
系统架构或者时设计的原则:高内聚低耦合;
层内部的组成应该是高度聚合的,而层与层之间的关系应该时低耦合的,最理想的情况为零耦合
2)控制反转
a.创建Service对象
FruitService fruitService = new FruitServiceImpl()
(利用FruitServiceImpl类实现FruitService接口,从而实例化接口对象),若该句位于某个方法内部,那么这个fruitService的作用域(生命周期)应该为这个方法级别。若这句话出现在Servlet类中,fruitService则是一个成员变量,那么这个fruitService的作用域(生命周期)应该为Servlet这个实例级别
b.在XML文件中定义fruitService,然后通过解析XML文件,产生fruitService实例,存放在beanMap中,这个beanMap在一个BeanFactory类中。因此,我们转移(改变)了之前的service实例、dao实例等等他们的生命周期。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转
<beans>
<bean id="fruitDAO" class="com.atguigu.fruit.dao.impl.FruitDAOImpl"/>
<bean id="fruitService" class="com.atguigu.fruit.service.impl.FruitServiceImpl">
<!-- property标签用来表示属性;name表示属性名;ref表示引用其他bean的id值-->
<property name="fruitDAO" ref="fruitDAO"/>
</beans>
3)依赖注入
a.在控制(FruitController)层出现代码:
FruitService fruitService = new FruitServiceImpl();
则控制层和service层存在耦合。之后,我们在FruitController层中将代码修改成:
FruitService fruitService = null ;
然后,在配置文件中配置:
<bean id="fruit" class="FruitController">
<property name="fruitService" ref="fruitService"/>
</bean>