资源描述
复习:
1)MVC模型
View:负责展示处理结果 JSP/HTML/FreeMarker/Velocity
Controller:负责接收请求、验证、调用Model Servlet/Filter/POJO
Model:负责业务功能(数据库、IO、Other) JavaBean
常见的MVC模型:SpringMVC Struts1 Sturts2 ThinkPHP
2)SpringMVC
SpringMVC是一个带前端控制器的MVC模型,主要关注的是Controller(FrontController+RequestHandler),对View有部分涉及(提供了几个标签),并没有涉及到Model。
SpringMVC的处理流程:
(1)服务器一启动,SpringMVC创建BeanFactory,创建所有Bean对象
(2)客户端发起请求,被前端控制器拦截并解析
(3)Spring做URL-Handler映射,调用Hanlder
(4)Handler调用接收请求、验证、调用业务逻辑,返回viewName
(5)Spring查找ViewResolver,装配出一个可以请求转发的完整页面名
(6)View发送结果给客户端
3)使用SpringMVC的步骤:
(1)导入jar
(2)声明前端控制器 DispatcherServlet
(3)创建applicationContext-mvc.xml
(4)声明URL-Handler映射
(5)创建Handler、Service、Dao,声明为Spring中的Bean
(6)声明ViewResolver
(7)创建jsp
1.DispatcherServlet的url-pattern可取值有如下三种形式:
(1)<url-pattern>*.do</url-pattern> 只拦截以.do结尾的请求
(2)<url-pattern>/</url-pattern> 拦截所有的请求,包括Handler、js、css、jpg.....
注意:url-pattern不能指定为/*, 会导致handler能够被调用,但无法请求转发到jsp
2.使用注解实现URL-Handler的映射
(1)声明使用注解实现映射applicationContext.xml
<mvc:annotation-dirven />
(2)对Controller及其中的方法使用注解,进行URL映射
@RequestMapping(“/user”)
public class UserController{
@ReqeustMapping(“/add”)
public String add(){
return viewName;
}
}
2.使用注解进行URL-Handler映射后,Hanlder获取请求参数的方式:
(1)Controller方法添加HttpServletRequest类型的形参即可,Spring调用此Controller方法时,会注入需要的request对象——不足:Controller依赖于一个Servlet容器对象,不便于进行独立的单元测试
public String add(HttpRequestServlet request){ }
(2)Controller方法中声明与请求参数一样名称的形参即可——让Controller与Servlet容器解耦
public String add(String uname, String upwd, int uno){ }
若请求参数的名称与Controller方法的形参名不一致,可以使用@RequestParam进行注解
public String add(@RequestParam(“userName”)String uname){ }
(3)若Controller方法中需要注入的请求参数很多,可以封装为实体类,只要实体类的属性名与请求参数名一致,也可以实现注入:
public String add(Message msg, int uno){ }
注意:有些情况下,如Controller方法向获取客户端所在IP地址,需要执行request.getRemoteIP(),request.getSession()只能使用方法一。
补充知识点:
网页内容的相对地址问题:
f1/f2/1.html:
<img src=”img/1.jpg”/>
那么图片的路径就是相对于当前HTML文件,即要去f1/f2/img/1.jpg文件,若把1.html放到路径下,图片的相对地址也会跟着改变,可能需要大量修改
解决方法:
<html>
<head>
<base href=”
</head>
<body>
<img src=”img/1.jpg”/>
<link href=”css/main.css”/>
<script src=”js/1.js”/>
</body>
<html>
只要声明了base元素,则当前页面中所有的相对地址都是相对于base的href值,而与当前页面的位置无关。
3.Controller中的数据传递给View的方式:
(1)通过HttpServletRequest.setAttribute
(2)让Controller的处理器方法返回ModelAndView对象,此对象中可以封装需要显示在页面中的数据,Spring会从其中读取数据,调用request.setAttribute();保存在request范围
(3)为Controller处理方法添加一个ModelMap类型的形参,需要显示在View中的数据保存在此Map中即可。Spring会自动从此Map中读取数据添加到request范围。
4.SpringMVC应用中的中文乱码问题
(1)GET请求中数据的乱码:
GET /day109/add?uname=%AE%98 HTTP/1.1
由于上述URI被tomcat截获,它默认理解为ISO8859-1字符集,可以修改它的配置文件server.xml
大约第70行 <Connector URIEncoding=”utf-8”....>
(2)POST请求中的乱码问题:
修改web.xml,声明一个字符集过滤器即可
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.让前端控制器对静态资源的请求进行放行
(1)方式一 DispatcherServlet的url-pattern作如下声明:
<url-pattern>*.do</url-pattern>
(2)方式二 若DispatcherServlet的url-pattern就特意声明为/,则可以在applicationContext中做过滤声明:
作业:
实现一个用户管理模块,包括如下功能:
前台(广大用户):
(1)注册新用户(用户名/密码/确认密码/邮箱/验证码/我同意)
(2)注册成功后,会提示成功,点击此处进行登录
(3)登录成功后,会提示欢迎回来:XXX,点击此处修改我的注册信息
(4)退出登录
后台(管理员功能):
(1)管理员登录
(2)登录成功后,浏览全部用户
(3)删除某个用户/一批用户
(4)(选作)锁定某个用户
展开阅读全文