SpringMVC框架----->(3) SpringMVC中的组件(核心控制器、业务控制器、视图解析器)

SpringMVC中的组件

  • SpringMVC框架中的组件主要有核心控制器、控制器映射、业务控制器、视图解析器

1、核心控制器

  • SpringMVC核心控制器就是DispatcherServlet,它负责接收HTTP请求,并组织协调SpringMVC的各组件共同完成处理的请求工作。
  • 负责拦截用户请求,所以它必须在程序启动时自动加载,并配置要获取的请求类型,这就需要在web.xml文件中对核心控制器进行配置。
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <!--自定义springmvc读取配置文件的位置-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<!--采用通配符映射所有.html的请求-->
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

2、控制器映射

  • 通过控制器映射(HandlerMapping),DispatcherServlet可以找到用来处理对应HTTP请求的业务控制器。

(1)配置BeanNameUrlHandlerMapping

  • Spring提供了不同的HandlerMapping实现类,如果Spring配置文件中没有定义控制器映射,DispatcherServlet会默认创建一个BeanNameUrlHandlerMapping,BeanNameUrlHandlerMapping使用方法简单,将处理器名称直接绑定在URL请求中,这就要求处理器名称与URL中的请求名称相同。

spring配置文件

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

(2)配置SimpleUrlHandlerMapping

  • SimpleUrlHandlerMapping使用mappings属性来定义URL到处理器的映射关系,这样处理器名称就不需要与URL中的请求名称相同

spring配置文件

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/index.html">forwardController</prop>
            <prop key="/stu/*.html">StuController</prop>
            <prop key="/UserLogin.html">UserLogin</prop>
        </props>
    </property>
</bean>

在SimpleUrlHandlerMapping中并不需要指定bean的 id 和name属性,DispatcherServlet可以自动探测到。

3、业务控制器

  • 业务控制器是由用户定义的,只需实现org.springframework.mvc.Controller接口即可,在接口中定义了一个handlerReques( )方法来处理用户请求,并返回一个ModelAndView对象。

(1)简单控制器

  • 简单控制器AbstractController类实现了Controller接口,是所有控制器的父类,,通常情况下很少使用简单控制器,因为Spring在简单控制器的基础上提供了许多功能单一的、更简单的控制器。

例子:获取表单数据

A、编写控制器类MyController
public class MyController extends AbstractController {
    
    

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    
    
        return new ModelAndView("show");
    }
}

说明
该控制器类获取表单信息将其保存到map对象中,由视图模型对象返回

B 、编写配置文件
<!--配置控制器-->
<bean name="/regController.html" class="com.hcz.controller.MyController"/>

<!--声明视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀:视图文件路径-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀:视图文件扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>
C、编写web.xml配置文件
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <!--自定义springmvc读取配置文件的位置-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<!--采用通配符映射所有.html的请求-->
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
D、编写index.jsp页面
<form action="regController.html" method="post">
    <table>
        <tr>
            <td>姓名:</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
E、编写显示页面show.jsp
<body>
    <table align="center" border="1">
        <tr>
            <td>姓名:</td>
            <td>${param.name}</td>
        </tr>
        <tr>
            <td>密码:</td>
            <td>${param.password}</td>
        </tr>
    </table>
</body>

(2)参数映射控制器

  • 参数映射控制器功能(ParameterizableViewController)与简单控制器相似,其不同点在于参数映射控制器把返回的视图逻辑名在配置文件中直接进行请求转发操作,而不需要在控制器中返回视图逻辑名。

  • 例如对上面的例子可以这样改进,将控制器类删除,修改配置文件如下:

<!--配置控制器-->
<bean name="/regController.html"
      class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    <!--配置视图名称-->
    <property name="viewName">
        <value>show</value>
    </property>
</bean>

<!--声明视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀:视图文件路径-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀:视图文件扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

直接将请求页面regController.html通过ParameterizableViewController转发到show.jsp页面中

(3)文件名映射控制器

  • 文件名映射控制器(UrlFilenameViewController)也是用于请求转发的,该控制器与其它控制器的区别在于使用了“前缀+请求名+后缀”的方式生成视图名。这里生成的视图名是和请求名一致的,例如请求是reg.html,经过文件名映射控制器后生成reg.jsp的视图名。
  • 例如对上面那个例子的配置文件做以下修改即可:
<!--文件名映射控制器:这里请求文件名要和返回的视图文件名一致-->
<bean name="/regController.html" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
    <!--前缀:视图文件路径-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀:视图文件扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

(4)表单控制器

  • SpringMVC提供了表单控制器(SimpleFormController) 来获取表单中的信息。SimpleFormController是AbstractFormController的继承子类,许允你在置配文件里通过successView和formView属性来置配功成图视(表单功成提交后要转向的页面)和表单图视(示显表单的页面);
1)get提交方式:

GET请求SimpleFormController显示表单时, 它会将表单视图呈现给用户

2)post提交方式

POST请求提交该表单时,SimpleFormController就会将表单域的值绑定到命令对象上,并用调onSubmit()方法来处理表单提交。如果表单提交成功,会呈现success视图。否则会呈现带错误信息的表单视图。

例子:用表单控制器验证用户登录

A、编写实体类User来封装表单中的用户名和密码
public class User {
    
    
    private String userName;
    private String userPwd;
//这里省略set、get方法
}

说明
这里需要把Bean中的属性名设置成和表单元素一致,这样表单控制器就会将表单中的数据封装成一个Bean对象。

B、编写控制器类UserLoginController
public class UserLoginController extends SimpleFormController {
    
    
    
    @Override
    protected ModelAndView onSubmit(Object command) throws Exception {
    
    
        User user = (User)command;
        String userName = user.getUserName();
        String userPwd = user.getUserPwd();
        Map map = new HashMap();
        if("mr".equals(userName)&&"mrsoft".equals(userPwd)){
    
    
            map.put("user", user);
            return new ModelAndView(getSuccessView(),"map",map);
        }else{
    
    
            map.put("error", "用户名或密码不正确,请重新输入!");
            return new ModelAndView(getFormView(),"map",map);
        }
    }
}

说明
这里onSubmit()方法传入了一个Object类型的对象,该对象封装了表单数据的实体对象。

C、编写配置文件
<!-- 表单控制器 -->
<bean name="/userLogin.html" class="com.hcz.controller.UserLoginController">
    <property name="commandClass">
        <value>com.hcz.entity.User</value>
    </property>
    <!-- 输入表单数据页面 -->
    <property name="formView">
        <value>index.jsp</value>
    </property>
    <!-- 表单提交后转入页面 -->
    <property name="successView">
        <value>success.jsp</value>
    </property>
</bean>

说明
这里commandClass参数设置为com.hcz.entity.User类型,这样在表单被提交时Spring会自动将表单中的数据封装到User类型对象并传递到onSubmit()方法中。

D、编写表单index.jsp页面
<body>
    <form  method="post">
        <table>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="userName"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="提交"></td>
            </tr>
        </table>
    </form>
</body>

说明
这里没有设置action属性,因为SpringMVC的表单控制器与正常的表单处理不同,该表单控制器从被请求时就已经开始控制表单。表单的输入、提交、转向结果页面都是由表单控制器来控制了。

E、编写登录成功页面success.jsp
<body>
    <center>
        系统登录成功<br><br><br>${map.user.userName},欢迎光临!
    </center>
</body>
F、配置web.xml文件
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <!--自定义springmvc读取配置文件的位置-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<!--采用通配符映射所有.html的请求-->
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

<!--声明过滤器,解决post乱码问题-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--设置字符编码-->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
    <!--强制请求对象(HttpServletRequest)使用encoding编码的值-->
    <init-param>
        <param-name>forceRequestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <!--强制请求对象(HttpServletResponse)使用encoding编码的值-->
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <!--/*:表示强制所有的请求先通过过滤器处理-->
    <url-pattern>/*</url-pattern>
</filter-mapping>
G、测试

输入http://localhost:8080/springmvc/userLogin.html地址访问项目,这是会看到登录页面,输入正确的用户名和密码则会进入登录成功页面

(5)多动作控制器

  • 多动作控制器(MutilAtionController)是一个控制器可以处理多个动作。在一个大项目中,往往需要定义很多个控制器,这样很不利于管理。这是可以将功能相近的一类控制器放置在一起,例如对用户信息的增删改查等操作。

例子:

A、定义该控制器类配置了对用户的增删改查方法
public class UserController extends MutilActionController {
    
    
    
    public ModelAndView selectUser(HttpServletRequest request, HttpServletResponse response){
    
    
        //省略主体方法
    }
    public ModelAndView insertUser(HttpServletRequest request, HttpServletResponse response){
    
    
        //省略主体方法
    }
    public ModelAndView updateUser(HttpServletRequest request, HttpServletResponse response){
    
    
        //省略主体方法
    }
    public ModelAndView removeUser(HttpServletRequest request, HttpServletResponse response){
    
    
        //省略主体方法
    }
}
B、创建配置文件
<!--多动作控制器-->
<bean id="userOperation" class="com.hcz.controller.UserController">
    <!--指定方法名解析器-->
    <property name="meth"
</bean>
<!--方法名解析器-->
<bean id="methodNameResolver" 
      class="org.springframework.web.servlet.mvc.multiactionParameterMethodNameResolver">
    <property name="paramName" value="method"/>
</bean>
C、测试

可以通过http://localhost:8080/springmvc/userOperation.html?method=selectUser来访问控制器中对应的方法

4、视图解析器

  • SpringMVC控制器中大部分方法会返回一个ModelAndView类型的对象,在该对象中包含一个逻辑视图名,Spring则通过视图解析器将这个逻辑视图名和实际视图关联到一起。最常用视图解析器为InternalResourceViewResolver,它通过“前缀+逻辑视图名+后缀”方式得到一个指向确定地址的JSP页面,配置方法如下:
配置InternalResourceViewResolver
<!--声明视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀:视图文件路径-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀:视图文件扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

猜你喜欢

转载自blog.csdn.net/hcz666/article/details/113985348
今日推荐