1、认识springMVC
作用:springMVC是表现层框架,底层对Servlet的封装,替代web程序中servelt 控制器那一程
回顾servlet作用:接收参数,处理请求,响应,跳转页面
方式:转发/重定向
执行流程:
2、springMVC入门
-
创建web动态项目
-
导入响应jar包
① Spring核心容器相关jar包
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-beans-4.1.2.RELEASE.jar
spring-context-4.1.2.RELEASE.jar
spring-core-4.1.2.RELEASE.jar
spring-expression-4.1.2.RELEASE.jar
② Spring测试相关jar包
spring-test-4.1.2.RELEASE.jar
spring-aop-4.1.2.RELEASE.jar – Spring测试需要导入此包
③ SpringMVC相关jar包:
spring-web-4.1.2.RELEASE.jar – Spring对web项目的支持
spring-webmvc-4.1.2.RELEASE.jar – SpringMVC核心包
-
在web.xml配置前端控制器
<servlet>
<!-- 配置前端控制器 -->
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 告诉web.xml配置的springMVC -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- 映射路径的设置 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
设置SpringMVC配置文件创建resources
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- 静态资源放行 = 静态资源可以不拦截 -->
<mvc:default-servlet-handler/>
</beans>
3、前端控制器编写方式
共有三种方式,用的最多的为方式三:
方式一(实现org.springframework.web.servlet.mvc.Controller;接口)
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloMvc implements Controller{
//前端控制器编写的方式一,implements Controller
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("你好controller!");
return null;
}
}
方式二(实现 implements HttpRequestHandler )
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloMvc2 implements HttpRequestHandler {
// 前端控制器编写的方式二,implements HttpRequestHandler
@Override
public void handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("我是前端控制器编写的方式二");
}
}
方式三(普通类+注解)
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//@Controller//spring会识别这个注解,进行扫描,并且创建该类的实例化对象
@Component //也可以使用@Component(普通类) 、 @Repository(dao层) 、@Service(service层)均可
@RequestMapping("/user")
public class HelloMvc3 {
// 前端控制器编写的方式三,普通类+注解
@RequestMapping("/eat")
public void eat(){
System.out.println("前端控制器编写的方式三,普通类+注解");
}
@RequestMapping("/put")
public void put(){
System.out.println("Java是一门面向对象的语言");
}
}
方式三还需要再spring-mvc.xml引入context命名空间及约束
<!-- 扫描包路径:上下文组件扫描 ,Spring容器会去扫描cn.itsource这个包及其子包中所有的类,如果发现类上有类似@Controller这样注解,就会创建该类的对象,并进行管理-->
<context:component-scan base-package="cn.itsource"></context:component-scan>
<!-- 开启Spring对Mvc的支持 = 能够使用@Requestmapping注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
4、全注解
-
匹配请求:@RequestMapping(“/hehe”) 前提:spring-mvc.xml 开启注解支持
可以写在类和方法上面
-
(1) 实例化对象:类所在包路劲,需要被是扫描
<context:component-scan base-package=“cn.itsource”> 父包,所有子包都会被扫描
<context:component-scan base-package=“cn.itsource._03Controller”> 精确扫描某个包:只会扫描本包
只能放在类的上面
① @Controller
② @Service
③ @Repository 持久Dao
④ @Component 普通类
注意: 相互使用
5、接收请求参数
共有四种方式:
-
通过传统的HttpServletRequest接收;
-
通过控制器的执行方法的参数接收;
-
通过对象来接收;
-
通过url中的参数接收(restfull风格) @PathVariable(“id”)转换;
@Controller
@RequestMapping("/login")
public class GetParamController {
//通过请求获取
@RequestMapping("/form1")
public void parm1(HttpServletRequest req ){
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
System.out.println(name+"---------"+pwd);
}
//通过参数获取
@RequestMapping("/form2")
public void parm2(String name , String pwd){
//参数名名字必须与xml中的对应
System.out.println(name+"---------"+pwd);
}
//使用对象进行获取
@RequestMapping("/form3")
public void parm3(User user){
//与类中字段名无关
System.out.println(user);
}
//restful风格:Url地址栏参数提取
@RequestMapping("/form4/{id}/{mm}")
public void parm4(@PathVariable("id")String name , @PathVariable("mm")String pwd){
//与类中字段名无关
System.out.println(name+"---------"+pwd);
}
6、过滤器
主要应对post请求乱码问题:可以自定义过滤器,SpringMVC写好的过滤器
web.xml中进行配置
<!-- 自定义配置过滤器,告诉web有一个过滤器 -->
<filter>
<filter-name>filter</filter-name>
<filter-class>cn.xxxx.myfilter.MyFilter</filter-class>
<init-param>
<param-name>enc</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
过滤器路径匹配,所有文件都需要从过滤器过
<url-pattern>/*</url-pattern>
</filter-mapping>
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//过滤器是去实现接口,因为是自己的去指定过滤规范
public class MyFilter implements Filter{
String enc;
//验证过滤器启动
public MyFilter(){
System.out.println("这是过滤器");
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2)
throws IOException, ServletException {
System.out.println("开始过滤........");
req.setCharacterEncoding(enc);//对请求设定编码
arg2.doFilter(req, resp);//放行!
}
//初始化方法,就会获取参数,并且封装进对象中
@Override
public void init(FilterConfig arg0) throws ServletException {
enc = arg0.getInitParameter("enc");
//System.out.println(enc);
}
}
<!-- SpringMVC写好的过滤器 -->
<filter>
<!-- 这个名字可以换,只要与下面的对应 -->
<filter-name>characterEncoding</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>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7、响应跳转向页面传值
共有三种方式:传递数据就是Controller往前台(页面)传递数据;
-
通过传统的HttpServletRequest传递;
-
通过ModelAndView对象传递;
-
通过Model对象传递;
@Controller
@RequestMapping("/login")
public class GetParamController {
// 通过传统的HttpServletRequest传递
@RequestMapping("/form5")
public void parm5(HttpServletRequest req , HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("message5", "你说什么鬼!");//存入请求对象,向前台共享数据
//转发的时候不会走视图解析器
req.getRequestDispatcher("/jsp/model2.jsp").forward(req, resp);
}
// 通过传统的Model传递
@RequestMapping("/form6")
public String parm6(Model model) {
//就当作是request对象
model.addAttribute("message6", "太累了!!");
//这里还可以传一个集合,数组,或者对象
User user = new User("你是谁","6666");
model.addAttribute("user", user);
//return "/jsp/model2.jsp";//返回的是一个路径
//使用视图解析器
//return "jsp/model2";//返回的是一个路径
//转发是不会走视图解析器,开始的/区别于绝对路径与相对路径
//return "forward:/jsp/model2.jsp";//转发的绝对路径
//return "forward:jsp/model2.jsp";//转发的相对路径 /login/jsp/model2.jsp,相对于当前设定的地址
//重定向不能够取值,所以前端看不到值
return "redirect:/jsp/model2.jsp";
}
// 通用ModelAndView对象传递
@RequestMapping("/form7")
public ModelAndView parm7() {
ModelAndView mv = new ModelAndView();
mv.addObject("message7", "奈史密斯");
mv.setViewName("/jsp/model2.jsp");
return mv;
}
8、Spring-MVC.xml中配置视图解析器
SpringMVC默认是转发
-
显示forword: 转发:不会经过视图解析器 一般不用
- forword:/jsp/model2.jsp 加了斜杠绝对路劲
- forword:jsp/model2.jsp 相对路劲,相对于当前的路劲 /login/jsp/model2.jsp
-
显示redirect: 重定向: 不会经过视图解析器
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property><!-- 前缀prefix:会自动在返回值前面加个上/ -->
<property name="suffix" value=".jsp"></property><!-- 前缀suffix:会自动在返回值后面加个上.jsp -->
</bean>
请求转发(forward) | 重定向(redirect) | |
---|---|---|
访问WEB-INF | *√* | *X* |
request传参 | *√* | *X* |
全新请求(URL变化) | *X* | *√* |
访问外网 | *X* | *√* |