配置springMVC
在maven工程中的pom文件中加入依赖:
Spring的jar包:spring-core spring-bean spring-aop spring-context spring-web
使用springMVC只需另外加入一个包:spring-webmvc
在服务器配置文件web.xml中添加dispatcher-servlet,并使其自动启动,并配置其配置文件路径。这样让所有的请求都通过dispatcher-servlet,而不用每个servlet都在web.xml中建立class和mapping配置项。
在springMVC配置文件中添加注解驱动并指定注解扫描包,扫描包一般设为控制器层的包,控制器层命名可以是Com.xxx.servlet或者com.xxx.controller或com.xxx.handler或com.xxx.action,里边包含@controller或@RequestMapping等控制器层的注解,添加包扫描路径使springMVC有能力帮助我们完成找到@controller并把类当成servlet处理等这样的功能。
在springMVC配置文件中添加InternalResourceViewResolver,因为我们一般在控制器层的返回值里直接写jsp的名字,这个解析器可以帮我们添加前后缀并找到相应的视图。
网页跳转功能
在任意可访问的网页中的跳转组件如或者按键的地址栏中写入想跳转的地址,在控制器层添加接收方法,首先使用@controller将类描述为控制器,使用@RequestMapping指定用于接收的地址,使请求跳转到指定的方法(返回值为String),返回jsp名字的字符串,InternalResourceViewResolver会帮助找到jsp文件并返回。
RequestMapping映射地址可以相同,此时我们可以动过RequestMapping中的method参数指定是处理哪种请求。
前台—>—数据—>—后台
传统方法:以前传输数据可以通过在地址栏最后写 ?[name]=[value]或者通过表单发值,然后在servlet通过req.getparamater得到参数。
新方法:
使用注释获取指定属性名的属性或者地址栏中的指定字段。或者在控制器方法参数里写一个用于接收属性的对象,或者在控制器方法参数里写一个servlet的req或者res。SpringMVC都可以帮助我们接收我们想要的参数并注入参数。
①我们使用地址栏传值
如果想传一个字符串“zgx”给后台,可以通过直接在地址栏中一个字段写上要发送的内容:
<a href="/test/zgx">发送zgx给后台</a>
这样通过以下语句就可以可以在控制层接收数据:
@RequestMapping("/test/{name}")
public String getName(@PathVariable("name") String name){
System.out.println(name);
return "r";
}
@RequestMapping将zgx这个字符串给了name这个变量,并配合@PathVariable将name变量赋给参数传进方法。
②通过表单传送值或对象
如果我们的值是通过表单传到后台的,可以通过@RequestParam接收参数。
Jsp:
<form action="/test1" method="post">
<input name="param1" type="text">
<input type="submit" value="发送">
</form>
控制层:
@RequestMapping("/test1")
public String getParam(@RequestParam("param1") String name){
System.out.println(name);
return "r";
}
多个@RequestParam可以接收多个参数,也可以在RequestParam的参数列表里将required参数改为false将其指定为非必要参数。
当我们向后台传送一个的表单的name属性是一个对象的属性名时,可以通过在一个控制器层的方法参数里直接用对象接收,并且支持级联,也就是如果对象的属性里有其他对象,也可以把其他对象的属性也封装进来。记得类属性加getter setter方法。
③后台直接获取其他信息
通过@RequestHeader直接获取请求头信息。
@RequestMapping("/test2")
public String getOtherParam(@RequestHeader("Accept-Language") String name){
System.out.println(name);
return "r";
}
如每个客户端和服务器通信时,服务器会为客户端创建一个session,并有一个sessionID,并把sessionID发送到客户端作为一个JsessionID,以保持每次本网页请求能使用这一个session。
通过@CookieValue得到Jsessionid:
@RequestMapping("/test3")
public String getOther(@CookieValue("JSESSIONID") String name){
System.out.println(name);
return "r";
}
后台—>—数据—>—前台
后台想把数据传到传到前端,需要定义一个返回类型为View或String或modelAndView的方法,但无论传什么数据,dispatchedsevlet默认都会将视图编程ModelAndView格式并返回。
如果想把数据(Model)和视图(View)传给前台,我们可以通过以下方式:
ModelAndView、ModelMap、Map、Model、@SessionAttributes、@ModelAttribute
①ModelAndView
控制器方法为一个返回值为ModelAndView的方法,在方法中创建ModelAndView的实例并返回,我们只需要给ModelAndView的实例添加数据和视图。
添加视图:ModelAndView有一些构造方法,比如直接传字符串进去就是指定view。也可以使用setView方法设置视图。
添加数据:ModelAndView实例可以添加键值对,使用addObject方法即可。
@Controller
@RequestMapping("/")
public class httpController {
@RequestMapping("checkUser")
public ModelAndView checkUser(Student student){
ModelAndView modelAndView = new ModelAndView("ret");
modelAndView.addObject("Student",student);
return modelAndView;
}
}
接收数据:在jsp中可以直接通过el语句得到数据。注意使用el表达式应该在jsp页面头加上<%@ page isELIgnored=“false”%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>返回界面</title>
</head>
<body>
${requestScope.get("Student").id} -
${Student.id} -
${Student.name} -
</body>
</html>
②ModelMap、Map、Model
使用这些方法的返回值为String,也就是这些方法只需要携带数据。
@RequestMapping("test1")
public String testModelMap(Student student, ModelMap mm){
mm.addAttribute("Student",student);
return "ret";
}
@RequestMapping("test2")
public String testMap(Student student, Map map){
map.put("Student",student);
return "ret";
}
@RequestMapping("test3")
public String testModel(Student student, Model model){
model.addAttribute("Student",student);
return "ret";
}
以上方法是通过request域来传送数据,如果想通过session传送数据,可以使用@sessionAttributes
命令如下:
@SessionAttributes(“student”)
上述注解的意思是如果把名字为student的对象被放进request中,则同时放一份进入session中。
还以一种命令:
@SessionAttributes(type={Student.class,Address.class}
上述注解的意思是如果有Student或Address类型的对象放进request,则同时放进session
接收时通过el表达式时在表达式前写上sessionScope就可以指定接收session中的数据库。
@ModolAttribute注解
这个注解可以将@ModelAttribute修饰的方法先执行,也就是每次请求前都执行它修饰的代码。并将方法参数中的map对象放入的Model对象给需要的方法一份,给的前提是map的key值应该是类名的首字母小写。
静态资源解析器:
如果想直接通过url请求服务器中的一张图片,如果不设置的情况下,所有请求都会通过dispatchedservlet去当做一个requestMapping中的url去寻找,就找不到网页。
解决办法:配置一个静态资源解析器,这样会对MVC配置的映射交给springMVC处理,如果没有,则交给tomcat默认的servlet来处理。Servlet的规则是如果没配置url,则按照静态资源来处理。
mvc:default-servlet-handler/要配合<mvc:annotation-driven />使用
前台不通过controller直接跳转
如果在mvc配置文件中添加如下一句,则当收到jump的请求时会直接跳转到名字为ret的jsp界面。
<mvc:view-controller path="/jump" view-name=“ret”/>
使用这种语句一点要加入注解驱动<mvc:annotation-driven />这样才能使上面的注解跳转和普通controller共存。
HiddenHttpMethodFilter
网页请求有四种类型:GET查、POST增、DELETE删、PUT改。
但是一般浏览器不支持DELETE和PUT,所以我们需要在服务器配置文件web.xml添加一个过滤器,这个过滤器对满足以下两条规则的请求作用,将其改变为DELETE或PUT请求。
1, 是post请求。
2, <input type=”hidden” name=”_method” value=”delete/put” />
符合这种要求的请求,由HiddenHttpMethodFilter改变请求类型。
CharacterEncodingFilter
在web.xml中配置字符编码过滤器可以将前台传到后台的中文字符正确显示。
其他知识点
默认的网页请求方式为get,如果不指定,就是get。
Ant风格:通配符*代表任意0个或多个字符,?代表一个字符,**代表0层或多层任意目录。