SpringMVC学习笔记
第一讲 简单使用SpringMVC框架
通过springMVC做一个简单的登录功能,从而简单了解一下SpringMVC的运行流程:
1.导入相应的jar包
spring-webmvc.jar包
2.SpringMVC配置文件springmvc.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 扫描注解 -->
<context:component-scan base-package="com.xt.controller"></context:component-scan>
<!-- 前后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3.在web.xml中,配置springmvc的入口,以及初始参数
<?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">
<servlet>
<servlet-name>spring</servlet-name>
<!-- SpringMVC入口 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- spring配置文件所在的路径 如果不配置需要将配置文件的名称设置为spring-servlet.xml -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 启动加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.login.jsp:
<form action="login/userLogin" method="post">
<ul>
<li>用户名:<input type="text" name="userName"/></li>
<li>密码:<input type="password" name="pwd"></li>
<li>
<input type="submit" name="登录">
</li>
</ul>
</form>
5.LoginController.class文件:
@Controller
@RequestMapping("/userLogin")
public class LoginController{
@RequestMapping("/login")
public String login(String userName,String pwd){
Systom.out.println("用户名:"+userName);
Systom.out.println("密码:"+pwd);
if(userName.equals("张三")&&pwd.equals("123"))
return "success";
else
return "error";
}
}
解析:
(1).因为在LoginController.class中,使用了注解,所以,在springmvc的配置文件中,我们需要
配置对注解的扫描范围。因为LoginController.class在com.xt.controller包下,所以我们就扫描
该包下的所有注解。base-package就是要扫描的包。否则注解无效
(2). 对于转发,我们通常会在COntroller层中返回一个字符串,该字符串是即将跳转的目标地址。不含
后缀名。所以,在配置文件中会配置前后缀。
<property name="prefix" value="/WEB-INF/views/"></property>代表目标文件所在的位置;
<property name="suffix" value=".jsp"></property>代表目标文件的文件类型
(3).在web.xml文件的配置中,我们需要注意的是首先要配置springmvc的入口,其次是配置文件springmvc.xml
的位置路径以及文件名称。
(4).对于普通的从页面到controller层的参数传递,有多种方式。在这里我们首先学习最基本的传参方式。
也就是页面的name属性的值与controller层的方法中的形参名称相同。还有多种传参方式,在下一章中
进行详细解说。
(5).仅仅到这里,我们基本完成了从页面传参以及转发的过程,可以进行简单的开发了。但是需要注意的是,
我们发现,当页面传递参数到controller层中时,发生了乱码的现象。处理方法就是在web.xml中配置一个
字符编码的过滤器。即:
<!-- 字符编码过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就解决了传参乱码的现象。当然也可以不在web.xml中写,可以创建一个filter类进行拦截。
第二讲 springMVC的传参方式
在之前的讲解中,我们使用了最简单的传参方式,就是让页面的name属性与controller层中方法中的
形参名称相同。还有一种传参的方式是由一名程序员在项目开发中实现的,叫做RestFul。这并不是
一种新的编码方式,而是一种风格。
例如:
@RequestMapping("/login/{userName}/{pwd}")
public String login(@PathVariable String userName,@PathVariable String pwd){
.......
}
在login.jsp中:
<a href="login/张三/123456">登录</a>
这样也可以将参数传到后台。
注意:
在@RequestMapping("/login/{userName}/{pwd}")中,{}与{}之间是用什么分隔符隔开,在前台就要用
相同的分隔符隔开,否则会找不到请求路径。
例如:
@RequestMapping("/login/{userName}_{pwd}")
那么在前台中:
<a href="login/张三_123456">登录</a>
在刚才的例子中,我们使用到了注解@PathVariable。否则参数无法传递到后台,结果是null。细心的
同学会发现,在刚才的例子中,@RequestMapping中的参数名称与方法中的形参名称相同,即:
@RequestMapping("/login/{userName}/{pwd}")
public String login(@PathVariable String userName,@PathVariable String pwd){
.......
}
如果不相同就会报错:
在请求路径中无法找到方法中所需的参数。
那么,假如哪天我就是想让它们不相同怎么办?
例如:
@RequestMapping("/login/{a}/{b}")
public String login(@PathVariable String userName,@PathVariable String pwd){
.......
}
这样肯定会报错,那么该怎么处理呢?
很简单,就是在@PathVariable中指明参数:
@RequestMapping("/login/{a}/{b}")
public String login(@PathVariable("a") String userName,@PathVariable("b") String pwd){
.......
}
第三讲 SpringMVC的转发与重定向以及静态资源的放行
1.转发
在开发过程中,为了提升安全性,我们通常会将jsp页面放在web-inf目录下。因为在web-inf目录下的文件是
不能直接访问的。那么我们该如何访问这些文件呢?
(1).首先我们要在springMVC的配置文件中,配置视图解析。也就是前后缀:
<!-- 前后缀 -->
<bean>
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
prefix:前缀(路径)
suffix:后缀
(2).在controller中,在进行转发的时候,直接返回一个字符串,该字符串就是即将要转发到的文件的名称。
例如:
@RequestMapping("/login")
public String login(String userName,String pwd){
System.out.println(userName);
System.out.println(pwd);
if(userName.equals("张三")&&pwd.equals("123456"))
return "success";
else
return "error";
}
return "success"就是转发到success.jsp。
(3).使用ModelAndView进行转发
官方为我们提供了一个类叫做ModelAndView,使用该类也可进行转发与重定向。
例如:
@RequestMapping("/login")
public ModelAndView login(String userName,String pwd){
ModelAndView mv = null;
if(2>1){
mv = new ModelAndView("success");
mv.add("userName",userName);
mv.add("pwd",pwd);
}else{
mv = new ModelAndView("error");
}
return mv;
}
解析:
ModelAndView类为我们提供了有参构造方法,该构造方法的参数就是我们即将要转发到的目标文件名称。
add()方法能够将要转发所带的的参数带到目标位置。
2.重定向
(1).在进行重定向的时候,可以使用redirect
例如:
@RequestMapping("/login")
public String login(String userName,String pwd){
System.out.println(userName);
System.out.println(pwd);
if(userName.equals("张三")&&pwd.equals("123456"))
return "redirect:/success.jsp";
else
return "redirect:/error.jsp";
}
注意:
在进行重定向 的时候,加"/"与不加"/"是有区别的:
(1).加"/"表示从根目录进行查找
(2).不加"/"表示从本类开始查找
(2).静态资源的放行
在开发过程中,我们会引入很多js或者css文件,那么springMVC拦截器可能会将这些文件拦截,
所以此时需要对这些文件进行放行。
<!-- 静态资源放行 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>