关于Servlet

目录

1.Servlet生命周期:实例化、初始化、职务、销毁

1)Servlet初始化

2)配置方法

2.Servlet中的ServletContext和

1)获取ServletContext

2)获取初始化值

3.业务层

Model1和Model2

4.IOC

1)耦合/依赖

2)控制反转

3)依赖注入


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>

<think>好的,我现在需要帮助用户找出关于Servlet配置的错误说法,特别是涉及Servlet名称、类指定、URL映射以及多个Servlet同时指定的问题。首先,我得回顾一下Servlet的配置相关知识,确保自己理解正确,这样才能准确判断错误选项。根据用户提供的引用内容,Servlet的配置主要在web.xml文件中完成,包括<servlet>和<servlet-mapping>元素。每个<servlet>元素必须包含<servlet-name>和<servlet-class>,分别指定注册名和完整的类名。而<servlet-mapping>则用于将已注册的Servlet映射到一个URL路径,包含同样的<servlet-name>和<url-pattern>。此外,Servlet3.0之后支持注解配置,比如@WebServlet。接下来,我需要考虑常见的错误配置。例如,一个Servlet是否可以映射到多个URL?根据引用[4],Servlet支持多重映射,即同一个Servlet可以通过不同的<url-pattern>多次映射。因此,如果一个选项说一个Servlet只能映射到一个URL,那就是错误的。另外,关于Servlet名称,<servlet-name>在同一个web.xml中必须是唯一的,不能重复。如果有两个不同的Servlet使用相同的<servlet-name>,这会导致配置错误。同时,每个<servlet>元素必须正确指定类名,如果类不存在或者类名写错,也是错误的。 关于多个Servlet同时指定的问题,比如是否可以在一个<servlet>元素中指定多个类,显然不行,因为每个<servlet>对应一个具体的类。如果有选项提到一个<servlet>可以配置多个类,那就是错误的。 还需要注意URL映射的规则,比如通配符的使用。例如,引用[4]提到可以使用通配符如*.do或/开头,但/*.do这样的写法可能不正确。此外,默认Servlet的配置是通过<url-pattern>/</url-pattern>,如果配置错误也会有问题。 最后,结合用户的问题,错误说法可能包括:Servlet名称不唯一、类名指定错误、一个Servlet无法多URL映射、多个Servlet共享同一个名称、在<servlet>中配置多个类等。需要逐一检查这些点,确保正确识别错误选项。</think>### 关于Servlet配置的错误说法分析 #### 错误说法示例及解析: 1. **一个`<servlet>`元素可以包含多个`<servlet-class>`子元素** - **错误原因**:每个`<servlet>`只能对应一个具体的Servlet类,`<servlet-class>`必须唯一且完整[^2][^5]。 - **正确配置**: ```xml <servlet> <servlet-name>Demo</servlet-name> <servlet-class>com.example.DemoServlet</servlet-class> </servlet> ``` 2. **不同的`<servlet>`可以使用相同的`<servlet-name>`** - **错误原因**:`<servlet-name>`在`web.xml`中必须唯一,否则会导致配置冲突[^2][^4]。 - **正确示例**: ```xml <servlet> <servlet-name>ServletA</servlet-name> <servlet-class>com.example.A</servlet-class> </servlet> <servlet> <servlet-name>ServletB</servlet-name> <servlet-class>com.example.B</servlet-class> </servlet> ``` 3. **一个`<url-pattern>`可以同时映射多个Servlet** - **错误原因**:每个`<url-pattern>`只能关联到一个`<servlet-name>`。若多个Servlet映射同一路径,容器会优先匹配精确路径或报错[^3][^4]。 - **正确配置**: ```xml <servlet-mapping> <servlet-name>ServletA</servlet-name> <url-pattern>/pathA</url-pattern> </servlet-mapping> ``` 4. **注解配置(如`@WebServlet`)中,`urlPatterns`可省略** - **错误原因**:使用注解时必须明确指定`urlPatterns`或`value`属性,否则Servlet无法被正确映射[^5]。 - **正确示例**: ```java @WebServlet(urlPatterns = "/demo") public class DemoServlet extends HttpServlet { ... } ``` 5. **`<url-pattern>`支持正则表达式(如`/user/\d+`)** - **错误原因**:Servlet规范仅支持简单通配符(如`*.do`或`/admin/*`),不支持正则表达式[^4]。 --- #### 正确配置要点总结: - **唯一性**:`<servlet-name>`需全局唯一,`<servlet-class>`必须存在且可加载。 - **映射关系**:一个Servlet可映射多个URL(通过多个`<servlet-mapping>`),但一个URL不能映射多个Servlet[^4]。 - **注解配置**:需明确指定`urlPatterns`,且遵循路径匹配规则[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值