欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springMVC笔记

程序员文章站 2024-03-09 18:01:41
...

springMVC是采用MVC设计模式的一个表现层轻量级web框架,是最主流的MVC框架之一
springMVC中有Model模型 View视图 Controller控制器以及springMVC特有的Front Controller前端控制器

环境搭建

创建maven工程,选择骨架org.apache.maven.archetypes:maven-archetype-webapp
补充目录结构java,resources,test
导入spring-context,spring-web,wpring-webmvc以及jsp,servlet的jar包

在controller包类(类似于web),在这个包下创建一个类

@Controller                                                     将该类放入spring容器中
//@RequestMapping(path="/users")                                可以使以下所有方法的@RequestMapping省略/users(已注释)
public class helloController { 

    @RequestMapping(path="/hello")                              请求路径
    public String sayHello() {
        System.out.println("你好springMVC");
        return "success";                                       跳转到success.jsp
    }
}

在resources下创建一个springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>                         需要spring-beans,mvc,context的约束
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.le"/>                  开启包扫描
<bean id="InternalResourceView" class="org.springframework.web.servlet.view.InternalResourceViewResolver">创建视图解析器
   <property name="prefix" value="/WEB-INF/pages/"></property>  配置前缀(除了index.jsp所有页面都放在pages目录下)
   <property name="suffix" value=".jsp"/>                       配置后缀
</bean>
<mvc:annotation-driven/> 
</beans>

配置webapp下的web.xml

<?xml version="1.0" encoding="UTF-8"?>                           web.xml需要的约束(Servlet3.1)
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
<display-name>springmvc-quick</display-name>                    命名(描述性文字,无实际作用)
<welcome-file-list>
   <welcome-file>index.jsp</welcome-file>                       配置初始页
</welcome-file-list> 
<servlet>
  <servlet-name>springmvc</servlet-name>                        核心控制器
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>                                                  配置初始化参数
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:springmvc.xml</param-value>       通过这个参数才能让springmvc.xml被加载
   </init-param>
   <load-on-startup>1</load-on-startup>                         启动项(在服务器启动的时候就开始初始化)
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>                                拦截请求(/* 匹配所有资源 /匹配除了jsp以外的所以资源)
</servlet-mapping>
</web-app>

运行流程
先创建核心容器->springmvc.xml被加载->扫描注解->将controller放入spring容器中
                                                                                 ->创建视图解析器
                                                                                 ->打开springmvc注解的支持

当有资源访问的时候,视图解析器通过访问路径调度到对应的方法上(通过@RequestMapping),最后通过return的值跳转到对应的页面上

备注
@RequestMapping这个注解类似于底下代码


public class BaseServlet extends HttpServlet {                               继承HttpServlet,重写service方法
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();                                    获取请求路径
        String methodName = uri.substring(uri.lastIndexOf('/') + 1);         获取方法名(通过截取请求路径获取)
        try {
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            Object invoke = method.invoke(this, req, resp);                  反射相关操作
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

代码解释
Servlet类都是一个功能对应一个Servlet,通过抽取方法将一堆功能继承在一个Servlet,增加代码可读性维护性
将需要调用的Servlet继承BaseServlet就能实现,并写好注解如@WebServlet("/user/*")
注解这个时候无实际意义,只是使用反射调用对应方法的标记而已
访问/user/add->this(谁调用谁就是this)通过字符串截取获取add->通过反射调用user下的add方法

@RequestMapping注解详解

@RequestMapping(value="/hello",method = RequestMethod.POST) 这个方法只有是Post请求才会被调用(超链接是get请求)
@RequestMapping(value="/hello",params = {“username”}) 接受的参数里必须有username
@RequestMapping(value="/hello",params = {“username=nm$”}) 接收的参数的键和值都要相同
@RequestMapping(value="/hello",headers = {“Accept”}) 请求头里必须有Accept这个参数

springMVC的自动赋值

准备HTML页面

<form action="hello7" method="get">                              
账号<input type="text" name="username"><br/>                     为account里的元素赋值
密码<input type="text" name="password"><br/>
ID<input type="text" name="id"><br/>
用户2<input type="text" name="user.username"><br/>               为account里的user这个实体类里的元素赋值
ID2<input type="text" name="user.id"><br/>
<input type="submit" value="登入!">
</form>

必须有成员变量以及对应的set方法
*获取方法为setUsername->Username->username

@RequestMapping(value="/hello")
public String sayHello(String username,String password) {       如果请求接受到username和password,springMVC将自动为方法参数赋值
     return "success";
}

@RequestMapping(value="/hello")
public String sayHello2(Account account) {                       如果是一个javaBean对象,将自动封装数据                
     return "success";
    }

为集合赋值
account里再提供List<User  >,Map<String,User>以及对应的set方法

用户2<input type="text" name="list[0].username"><br/>            为List集合赋值
ID2<input type="text" name="list[0].id"><br/>
 
用户3<input type="text" name="map['first'].username"><br/>       为Map集合赋值
ID4<input type="text" name="map['first'].id"><br/>

中文问题

在web.xml中配置中配置过滤器

<filter>
    <filter-name>filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>                        编码为UTF-8
    </init-param>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

自定义类型转换器

必须实现Converter<S,T>并重写convert方法

public class StringToDate implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        if (source == null) {
            System.err.println("参数不能为空");
            throw new RuntimeException();
        }
        Date parse = null;
        try {
            parse = new SimpleDateFormat("yyyy-MM-dd").parse(source);
        } catch (ParseException e) {
            System.err.println("输入的参数无法转换");
            throw new RuntimeException();
        }
        return parse;
    }
}

配置自定义类型转换器

 <!--自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">   
        <property name="converters">
            <set>
                <bean class="cn.le.Converter.StringToDate"></bean>
            </set>
        </property>
    </bean>
 <!--springMVC注解的支持,将自己的代码也生效的配置-->
 <mvc:annotation-driven conversion-service="conversionService"/>
相关标签: mvc 控制器