victory的博客

长安一片月,万户捣衣声

0%

简单工厂模式

工厂:用一个单独的类来完成创造实例的过程。
案例
类图:

class Operation{
    private double numberA = 0;
    private double numberB = 0;
    public double getNumberA() {
        return numberA;
    }
    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }
    public double getNumberB() {
        return numberB;
    }
    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }
    public double getResult() throws Exception{
        double result = 0;
        return result;
    }
}

class Add extends Operation{
    public double getResult()
    {
        double result = 0;
        result = getNumberA() + getNumberB();
        return result;
    }
}

class Sub extends Operation{
    public double getResult()
    {
        double result = 0;
        result = getNumberA() - getNumberB();
        return result;
    }
}

class Mul extends Operation{
    public double getResult()
    {
        double result = 0;
        result = getNumberA() * getNumberB();
        return result;
    }
}

class Div extends Operation{
    public double getResult() throws Exception
    {
        double result = 0;
        if (getNumberB() == 0){
            throw new Exception("除数不能为0");
        }
        result = getNumberA() / getNumberB();
        return result;
    }
}

//工厂:用一个单独的类来做这个创造实例的过程
class OperationFactory{
    public static Operation createOperate(String operate){
        Operation oper = null;
        
        if(operate.equals("+")){
            oper = new Add();
        }else if(operate.equals("-")){
            oper = new Sub();
        }else if(operate.equals("*")){
            oper = new Mul();
        }else if(operate.equals("/")){
            oper = new Div();
        }
        return oper;
    }
}

public class SimpleFactoryTest {
    public static void main(String[] args) throws Exception {
        Operation oper = OperationFactory.createOperate("+");
        oper.setNumberA(1);
        oper.setNumberB(2);
        double result = oper.getResult();
        System.out.println(result);
    }
}

在使用简单工厂模式的情况下,如果我们要增加新的功能,比如说现在要增加一个求余操作,
我们需要增加一个用于求余运算的类,然后在OperationFactory中增加对于求余运算的逻辑判断,这样的做法违背了
开放封闭原则,即在开放拓展的同时也开放了修改。

class Mod extends Operation{
    public double getResult(){
        double result = 0;
        result = getNumberA() % getNumberB();
        return result;
    }
}

class OperationFactory{
    public static Operation createOperate(String operate){
        ......
        else if(operate.equals("%")){
            oper = new Div();
        }
        ......
    }
}

spring和springMVC的整合

1、不整合:需要将spring所管理的内容都交给springMVC管理,这样会造成业务逻辑混乱
2、整合:spring的配置文件什么时候加载?怎么加载?
解决办法:监听器,可以在ServletContext加载时,通过监听器加载spring的配置文件,创建spring容器
spring提供的监听器:ContextLoaderListener
3、bean被创建两次的问题:在springMVC中只扫描控制层,在spring中,通过包含或排除对所扫描的包进行指定
4、spring和springMVC的关系
spring是父容器
springMVC是子容器
规定:子容器能够调用父容器的bean,而父容器不能够调用访问子容器中的bean

阅读全文 »

异常处理

1.在SpringMVC配置文件(springMVC.xml)中做以下配置:

<!-- 异常处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.NullPointerException">error</prop>
        </props>
    </property>
</bean>
阅读全文 »

拦截器 HandlerInterceptor

1.在SpringMVC配置文件(springMVC.xml)中进行以下配置:

<mvc:interceptors>
    <!-- 默认拦截所有请求 -->
    <!-- 第一种方式 -->
    <bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
    <bean class="com.atguigu.interceptor.SecondInterceptor"></bean>
    <!-- 
        第二种方式
        此方式要求拦截器上必须加注解@Component
     -->
    <!-- <ref bean="firstInterceptor" /> -->
    
    <!-- 设置自定义拦截方式 -->
    <!-- <mvc:interceptor>
        <bean></bean>
        <mvc:mapping path=""/>
        <mvc:exclude-mapping path=""/>
    </mvc:interceptor> -->
</mvc:interceptors>
阅读全文 »

上传和下载文件

注意:上传文件需要在springMVC.xml中配置如下所示bean:

<!-- 
    处理文件,将客户端上传的File文件处理为MultipartFile
    注意:文件解析器bean中的id必须设置为multipartResolver 
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置文件解析的编码,注意一定要和页面的pageEncoding保持一致 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 设置最大上传文件大小 -->
    <property name="maxUploadSize" value="88888888"></property>
</bean>
阅读全文 »

json表示方式

1.json有两种对象
(1)json对象:{key1:value1,key2:value2,…}
(2)json数组:[value1,value2,…]
2.解析方式
(1)Json对象解析方式:对象.key
(2)json数组解析方式:for循环遍历
3.java对象转换json
(1)Bean和map—>json对象
(2)List—>json数组

示例:
数据:
user:id=1,username=admin,age=23,sex=男

Xml方式:

1
2
3
4
5
6
7
8
<userinfo>
<user>
<id>1</id>
<username>admin</username>
<age>23</age>
<sex></sex>
</user>
</userinfo>

Json方式:

1
{id:1,username:admin,age:23,sex:男}

处理静态资源

在使用了SpringMVC的项目中,在使用css/js等静态资源时,需要在SpringMVC的配置文件中做以下配置:

<!-- 处理静态资源 -->
<!-- 
    配置Tomcat中默认的servlet,DefaultServlet
    注意:当DefaultServlet所设置的<url-pattern>的值和开发人员所配置
        的servlet的<url-pattern>相同,以开发人员所配置的servlet优先
    作用: 当客户端发送请求,由于DefaultServlet所设置的<url-pattern>的
        值和开发人员所配置的DispatcherServlet的<url-pattern>都是/,
        因此先通过DispatcherServelet处理请求,找该请求是否有相对应的处理器,
        有则处理,无则交给DefaultServlet处理
-->
<mvc:default-servlet-handler/>
<!-- mvc驱动 -->
<mvc:annotation-driven />