J2EE-020 Spring(五) Spring-MVC(上)
Spring-MVC
1.创建mvc项目步骤
1.引入Spring-mvc,Jar包
` <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>`
2.在web.xml中配置servlet
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--要求DispatcherServlet实例和Web服务器同时实例化-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--里面设置值越大执行优先级越高-->
<load-on-startup>0</load-on-startup>
</servlet>
<!--配置Servlet-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
因为servlet是方法后才走init方法初始化,spring-mvc要提前加载Bean文件需要设置和Web服务器同时实例化,其中 contextConfigLocation是固定搭配,加载Bean classpath:spring-configuration的配置文件名加载Bean,0为设置优先级
3.在spring-mvc.xml中配置通过扫描包的方式加载Bean
<context:component-scan base-package="包路径"></context:component-scan>`
4.将实体类加入Bean
在实体类中标注注解@Controller让包加载到Bean,@RequestMapping(“访问路径”)设置在方法。
回顾知识点,servlet的访问路径配置,注解形式@webservlet(name=“类名称”,urlPatterns =“路径”)
@Controller
public class TestController {
public TestController(){
System.out.println("sss");
}
@RequestMapping("/hello")
public String doindex(){
return "index";
}
}
4.配置视图解析器
这里发现这里实际访问路径为/WEB-INF/views/XX.jsp,
通过配置视图解析器简化代码
<bean id="viewresolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
其中prefix为前部路径,suffix为后半截路径
5.测试成功
2.静态资源放行(二种)
引出问题:之前servlet的老问题了,就是我们所有请求都进行了拦截进入Baseservlet那么js,css,image文件是肯定进入不了代码找不到对应的路径,因此我们需要对一些静态资源进行放行,再BaseServlet中我们解决的办法是通过请求的后缀和固定请求放行(指不需要权限认证的login,Verification Code)
1.第一种(mvc自定义标签放行)
1.开启自定义配置文件
再在bean文件中配置<mvc:annotation-driven></mvc:annotation-driven>
2.定义需要放行的静态资源路径
配置需要放行的路径 <mvc:resources mapping="/static/js/**" location="/static/css/"/>
mapping是路径下的什么文件,这个意思static/js下面的所有文件,loaction表示加载路径
<mvc:resources mapping="/static/js/**" location="/static/css/"/>
<mvc:resources mapping="/static/css/**" location="/static/css/"></mvc:resources>
<mvc:resources mapping="/static/image/**" location="/static/image/"></mvc:resources>
3.测试
2.第二种(自动放行所有静态资源)
放行所有静态资源<mvc:default-servlet-handler/>
在bean配置文件中配置<mvc:default-servlet-handler/>
会自动放行所有的静态资源 ,
配置使用自定义mvc标签<mvc:annotation-driven></mvc:annotation-driven>
测试
成功
3.SpringMVC常用API
@Conttroller
@Conttroller,标注在类上高速MVC这个是一个控制器
@RequestMapping
标注在类代表父路径,标注在方法表示子路径
注意,在视图解析器InternalResourceView中的前部份方法prefix中一定要以/开头,不如标注在RequestMapping上的方法会变为根目录
错误示范
正确示范
@RequestParams(“请求参数的名称”)
用于将请参数区数据映射到功能方法上
代码实现
@RequestMapping("/hello1")
public ModelAndView doindex(@RequestParam("msg")String msg){
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
mv.addObject("msg",msg);
return mv;
}
返回一个ModelAndView,setViewName表示返回的视图名称,addObject为添加参数
前端用JSP调用获得的MSG参数为:${msg}
测试
@ResponseBody()和@RequestBody()
@ResponseBody()作用是将返回对象JSON格式返回给前端
@RequestBody()把前端的请求JSON转为对应的实体对象
1.引入jackjson-databind
因为spring-mvc是用的jackjson里的json,所以引入jackjson,注意这里一定要引用2.9版本以上的<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
2.编码
@RequestMapping(value = "/userJson",method = RequestMethod.POST)
@ResponseBody
public User json(@RequestBody(required = false) User user) {
return user;
}
RequestMapping类型默认是GET设置method = RequestMethod.POST为POST
测试
用Talend API进行测试
@RestController
让整个类返回对象都以JSON格式返回
@PathVarible
Rest风格URL请求,比如请求System/{nothing}/{default}
在请求参数标注就可以拿值
编码
`@GetMapping("/system/{name}/{math}")
public String rest(@PathVariable("name") String name,@PathVariable("math") String math){
return "name="+name+"math="+math;
}`
测试
参数绑定
基础参数(属性,对象)
简单类型
<form action="receiveString" method="post">
<input name="username" value="张三" type="text"/>
<input type="submit" value="提交">
</form>
@RequestMapping("/receiveString")
public void receiveString(String username){
System.out.println(username);
}
包装类类型
//定义类型
public class Subject{
private User user;
}
public class User {
private String name;
private Integer age;
}
<form action="receiveUser" method="post">
用户名:<input type="text" name="user.name" value="张三"></br>
年龄:<input type="text" name="user.age" value="18"></br>
<input type="submit" value="提交">
</form>
@RequestMapping("/receiveUser")
public void pojo(Subject user){
User user = new User();
user.setName(subject.user.getName());
user.setAge(subject.user.getAge());
return user;
}
测试
高级参数(数组,List)
数组
<form action="receiveArray" method="post">
<c:forEach item="${userList}" var="user">
用户名:<input type="text" name="username" value="${user.username}"></br>
年龄:<input type="text" name="age" value="${user.age}"></br>
</c:forEach>
<input type="submit" value="提交">
</form>
@RequestMapping("/receiveArray")
public void pojo(Integer age[]){
for(int age : ages)
System.out.println(age);
}
List
<form action="receiveList" method="post">
<c:forEach item="${userList}" var="user">
用户名:<input type="text" name="userList[0].username"></br>
年龄:<input type="text" name="userList[0].age"></br>
用户名:<input type="text" name="userList[0].username"></br>
年龄:<input type="text" name="userList[0].age"></br>
</c:forEach>
<input type="submit" value="提交">
</form>
@RequestMapping("/receiveList")
public void pojo(UserCustom userCustom){
System.out.println(userCustom);
}