随着不断增多且越来越复杂的需求产生,开发者不得不做很多重复的工作。在使用springmvc后,明显的减少了工作量。至于springmvc的各种优点,我暂时不列出来了,有很多很棒的博文做出了解释。接下来,我们看看如何配置和使用。
首先我们要知道,springmvc使用在web项目中的。所以,我们要建一个web项目。web项目的配置是从web.xml中读取,让我们看看web.xml该如何写。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>jq_springweb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.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-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>charEncoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charEncoding</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
</web-app>
可以看出,由于代码越写越多,我进行了很多配置。不要慌,让我们慢慢的分析。加粗部分是我们的核心部分,没有他我们就无法使用springmvc。这部分配置了springmvc提供给我们的dispatcherservlet,并且初始化了springmvc配置文件的位置。这个配置文件我们后面会来将。斜体字部分,我们配置了过滤器,解决了乱码问题。到这了,web.xml基本配置完毕,下面我们看看springmvc的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 使静态资源起作用,会导致拦截器不起作用-->
<!-- <mvc:default-servlet-handler/> -->
<!-- <bean id="myInterceptor" class="com.briup.web.interceptor.MyInterceptor"></bean>
<bean id="myInterceptor2" class="com.briup.web.interceptor.MyInterceptor2"></bean>
<bean id="timeinterceptor" class="com.briup.web.interceptor.TimeInterceptor"></bean> -->
<!-- handlermapping配置 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<!-- <property name="interceptors" >
<list>
<ref bean="myInterceptor"/>
<ref bean="myInterceptor2"/>
<ref bean="timeinterceptor"/>
</list>
</property> -->
</bean>
<!-- 让注解起作用 -->
<context:component-scan base-package="com.briup.web.controller"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置handleradapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 配置统一异常处理视图解析器 -->
<!-- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"></property>
<property name="exceptionAttribute" value="except"></property>
</bean> -->
<!-- 用于上传文件 -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="2000000000"></property>
</bean>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean name="/hello.action" class="com.briup.web.controller.HelloController"></bean>
</beans>
这里面,加粗部分是我们必须要配置的部分。其他的就是用于相关功能的配置。springmvc中,我们常用的是拦截器,控制器这两个组件。这些组件在配置的时候,可以用注解的方式,也可以使用xml配置的方式。如果使用注解的方式,需要在springmvc中进行如下配置
<!-- 让注解起作用 -->
<context:component-scan base-package="com.briup.web.controller"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
下面我们先讲讲拦截器。拦截器,顾名思义,对服务器的访问进行一些拦截操作。使用拦截器需要进行如下配置。
<!-- <bean id="myInterceptor" class="com.briup.web.interceptor.MyInterceptor"></bean>
<bean id="myInterceptor2" class="com.briup.web.interceptor.MyInterceptor2"></bean>
<bean id="timeinterceptor" class="com.briup.web.interceptor.TimeInterceptor"></bean> -->
<!-- handlermapping配置 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<!-- <property name="interceptors" >
<list>
<ref bean="myInterceptor"/>
<ref bean="myInterceptor2"/>
<ref bean="timeinterceptor"/>
</list>
</property> -->
</bean>
同时需要注释掉是静态资源起作用的配置
<!-- 使静态资源起作用,会导致拦截器不起作用-->
<!-- <mvc:default-servlet-handler/> -->
那么,在这种情况下需要是静态资源起作用该怎么办呢。那就得对其进行配置,这里就不拓展了。
控制器的使用就相当复杂了,我们今天就不详细说明。
上面配置中配置了一个控制器,这就是xml配置控制器的方法
<bean name="/hello.action" class="com.briup.web.controller.HelloController"></bean>
我将这个控制器挂出来,很简单的。
public class HelloController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse resp) throws Exception {
System.out.println("hello controller");
String name=req.getParameter("name");
ModelAndView mv=new ModelAndView();
mv.setViewName("index");
mv.addObject("name",name);
System.out.println(name);
// String [] path={"com/briup/hibernate/dao/hibernate_dao.xml",
// "com/briup/hibernate/service/hibernate_service3.xml"};
// ApplicationContext containerApplicationContext=
// new ClassPathXmlApplicationContext(path);
// IAccountService service=(IAccountService)containerApplicationContext.getBean("accountService");
// Account account=new Account("xuxiao7","xuxiao7",11.111,new Date());
// service.openAccount(account);
return mv;
}
}
控制器我们可以理解为servlet。我们访问它,获取我们需要的信息。这里,他返回了index.jsp给我们。结合配置文件,意思就是我们可以访问/hello.action,到达index.jsp这个页面。当然,我们也可以通过注解的方式配置。
//跳转问题
@Controller
public class DispatherController {
@RequestMapping("/disb")
public String disB(){
System.out.println("in dis b");
return "index";
}
@RequestMapping("/disc")
public void disC(HttpServletRequest req,HttpServletResponse Resp){
//内部跳转
// try {
// System.out.println("in dis c");
// req.getRequestDispatcher("/disb").forward(req, Resp);
// //req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, Resp);
// } catch (ServletException | IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// };
//重定向 web-inf下面的资源重定向访问不到
try {
System.out.println("in dis c");
Resp.sendRedirect("disb");
//Resp.sendRedirect("/WEB-INF/jsp/index.jsp");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@RequestMapping("/disA")
public String disA(){
System.out.println("in dis a...");
//return "index";
//return "forward:disb";
return "redirect:disb";
}
@RequestMapping("/errortest")
public String error(){
int i=10/0;
return "index";
}
}
这里面列举了很多控制器的灵活运用。我们可以再在类上面配置requestmapping,给下面的URL增加一级条目。这里,我们可以通过控制器跳转到jsp,也可以访问其他控制器。控制器还有其他更多的注解方式,非常便捷,大家可以去了解,我这里就不一一讲解了。