springMVC配置
SpringMVC����.docx
image.png
1.web.xml

  1. <!-- 注册springMVC-->
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <init-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:springmvc.xml</param-value>
  8. </init-param>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springmvc</servlet-name>
  12. <!-- 指定拦截对象-->
  13. <url-pattern>*.action</url-pattern>
  14. </servlet-mapping>

1.访问流程
image.png

@requestMapping详解

@RequestMapping注解详解
此注解就是来映射服务器访问的路径.
1)此注解可加在方法上,是为此方法注册一个可以访问的名称(路径)
@RequestMapping(“/demo”)
public String demo(){
System.out.println(“服务器被访问到了…….”);
return “main”; //可以直接跳到/admin/main.jsp页面上
}
访问服务器

2)此注解可以加在类上,相当于是包名(虚拟路径),区分不同类中相同的action的名称
@RequestMapping(“/user”)
public class DemoAction1 {..}
访问服务器

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <br><br>
  8. <a href="${pageContext.request.contextPath}/test01/demo.action">访问服务器</a>
  9. <a href="${pageContext.request.contextPath}/test02/demo.action">访问服务器</a>
  10. </body>
  11. </html>

3)此注解可区分get请求和post请求
@Controller
public class ReqAction {
@RequestMapping(value = “/req”,method = RequestMethod.GET)
public String req(){
System.out.println(“我是处理get请求的……..”);
return “main”;
}
@RequestMapping(value = “/req” ,method = RequestMethod.POST)
public String req1(){
System.out.println(“我是处理post请求的……..”);
return “main”;
}
}
index.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <br><br><br>
  8. <h2>测试不同的请求</h2>
  9. <form action="${pageContext.request.contextPath}/req.action" method="post">
  10. <input type="submit" value="提交">
  11. </form>
  12. </body>
  13. </html>

五种表单提交方式优化

第一种数据提交方式

1.controller

  1. @Controller
  2. public class DateTest {
  3. @RequestMapping("/one")
  4. public String one(String myname,int age){
  5. System.out.println("myname:"+myname+"," +
  6. "age:"+age);
  7. return "main";
  8. }
  9. }

2.jsp页面

  1. <h2>数据提交测试</h2>
  2. <form action="${pageContext.request.contextPath}/one.action">
  3. 姓名:<input name="myname"><br>
  4. 年龄:<input name="age"><br>
  5. <input type="submit" value="提交">
  6. </form>
  7. </body>
  8. </html>

3.单词一定不要写错

第二种对象封装提交方式

controller.java

  1. @RequestMapping("/two")
  2. public String two(Users u){
  3. // 这里直接存入对象,姓名和年龄属性值会自动存在对象里面
  4. System.out.println("users="+u);
  5. return "main";
  6. }

index.jsp

  1. <h2>第二种数据提交测试</h2>
  2. <form action="${pageContext.request.contextPath}/two.action">
  3. 姓名:<input name="name"><br>
  4. 年龄:<input name="age"><br>
  5. <input type="submit" value="提交">
  6. </form>

第三种动态占位符提交(解决路径名称不一样)

1.controller.java
如果形参是 @RequestMapping(“/three/{uname}/{uage}”)
那么下面的注解也要改成
@PathVariable(“uname”) String name,
@PathVariable (uage)int age

  1. //动态站位符提交
  2. @RequestMapping("/three/{name}/{age}")
  3. public String three(
  4. @PathVariable String name,
  5. @PathVariable int age){
  6. System.out.println("name="+name+",age="+age);
  7. return "main";
  8. }

2.index.jsp

  1. <br>
  2. <h2>动态占位符提交</h2>
  3. <a href="${pageContext.request.contextPath}/three/张三/22.action">动态提交</a>

第四种请求参数名称参数(解决参数名称不一致)

image.png
1.controller.java( @RequestParam)

  1. @RequestMapping("/four")
  2. public String four(
  3. @RequestParam("name")
  4. String uname,
  5. @RequestParam("age")
  6. int uage){
  7. System.out.println("name="+uname+",age="+uage);
  8. return "main";
  9. }

2.index.jsp

  1. <h2>第四种请求参数名称映射</h2>
  2. <form action="${pageContext.request.contextPath}/four.action">
  3. 姓名:<input name="name"><br>
  4. 年龄:<input name="age"><br>
  5. <input type="submit" value="提交">

第五种手动接收数据

controller.java

  1. //手动接收数据
  2. @RequestMapping("/five")
  3. public String five(HttpServletRequest request){
  4. String name = request.getParameter("name");
  5. int age = Integer.parseInt(request.getParameter("age"));
  6. System.out.println("name="+name+",age="+age);
  7. return "main";
  8. }

处理post提交中文乱码问题(配置)

1.在resources文件夹下对web.xml文件进行配置

  1. <!-- 中文编码过滤配置 -->
  2. <filter>
  3. <filter-name>encode</filter-name>
  4. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  5. <!--
  6. 初始化参数:
  7. private String encoding;
  8. private boolean forceRequestEncoding;
  9. private boolean forceResponseEncoding;-->
  10. <init-param>
  11. <param-name>encoding</param-name>
  12. <param-value>UTF-8</param-value>
  13. </init-param>
  14. <init-param>
  15. <param-name>forceRequestEncoding</param-name>
  16. <param-value>true</param-value>
  17. </init-param>
  18. <init-param>
  19. <param-name>forceResponseEncoding</param-name>
  20. <param-value>true</param-value>
  21. </init-param>
  22. </filter>
  23. <filter-mapping>
  24. <filter-name>encode</filter-name>
  25. <!-- /*代表所有请求-->
  26. <url-pattern>/*</url-pattern>
  27. </filter-mapping>

action方法的返回值

1)String:客户端资源的地址,自动拼接前缀和后缀.还可以屏蔽自动拼接字符串,可以指定返回的路径.
2)Object:返回json格式的对象.自动将对象或集合转为json.使用的jackson工具进行转换,必须要添加jackson依赖.一般用于ajax请求.
3)void:无返回值,一般用于ajax请求.
4)基本数据类型,用于ajax请求.
5)ModelAndView:返回数据和视图对象,现在用的很少.

请求转发和重定向的区别

image.png

  1. @Controller
  2. public class TestAction {
  3. @RequestMapping("/one")
  4. public String one(){
  5. System.out.println("请求转发页面。。。");//url:one.action
  6. return "main";
  7. }
  8. @RequestMapping("/two")
  9. public String two(){
  10. System.out.println("请求转发action。。。");//url:two.action
  11. return "forward:/other.action";
  12. }
  13. @RequestMapping("/three")
  14. public String three(){
  15. System.out.println("重定向跳转页面。。。");//url:main.jsp
  16. return "redirect:/admin/main.jsp";
  17. }
  18. @RequestMapping("/four")
  19. public String four(){
  20. System.out.println("重定向跳转action。。。");//url:other.action
  21. //other.action请求转发到main.jsp所以显示的地址依旧是othe.action
  22. return "redirect:/other.action";
  23. }
  24. }

在action中携带数据到要跳转的页面上

请求转发

action.java

  1. @Controller
  2. public class DataAction {
  3. @RequestMapping("/data")
  4. public String data(HttpServletRequest request,
  5. HttpServletResponse response,
  6. HttpSession session,
  7. Model model,
  8. Map map,
  9. ModelMap modelMap){
  10. Users u = new Users("张三",22);
  11. request.setAttribute("requestUsers",u);
  12. session.setAttribute("sessionUsers",u);
  13. model.addAttribute("modelUsers",u);
  14. map.put("mapUsers",u);
  15. modelMap.addAttribute("modelMapUsers",u);
  16. return "main";
  17. }
  18. }

2.index.jsp

  1. <a href="${pageContext.request.contextPath}/data.action?name=may">请求参数携带数据到服务器</a>

3.跳转的main页面

  1. <%--
  2. request.setAttribute("requestUsers",u);
  3. session.setAttribute("sessionUsers",u);
  4. model.addAttribute("modelUsers",u);
  5. map.put("mapUsers",u);
  6. modelMap.addAttribute("modelMapUsers",u);--%>
  7. requestUsers:${requestUsers}<br>
  8. sessionUsers:${sessionUsers}<br>
  9. modelUsers:${modelUsers}<br>
  10. mapUsers:${mapUsers}<br>
  11. modelMapUsers:${modelMapUsers}<br>
  12. index.jsp页面的数据带到main页面:${param.name}

4.把index.jsp页面的数据带到main页面

  1. index.jsp页面的数据带到main页面:${param.name}
  2. <!--name是key值-->

注意:Map,Model,ModelMap和request一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.

重定向

image.png

  • 重定向只有session的数据

    日期处理

    日期提交处理

    单个日期提交

    配置注解驱动

    1. <mvc:annotation-driven></mvc:annotation-driven>
    2. <!--这里要是mvc后缀-->

    controller.java ```java @Controller public class MyDateAction {

    SimpleDateFormat sf = new SimpleDateFormat(“yyyy-MM-dd”); // /* // 日期:
    // // / @RequestMapping(“/mydate”) public String mydate(

    1. @DateTimeFormat(pattern = "yyyy-MM-dd")
    2. Date mydate){
    3. System.out.println(mydate);
    4. System.out.println(sf.format(mydate));
    5. return "show";

    }

  1. <a name="oeM8c"></a>
  2. ### 类中全局日期处理(不用在xml文件中注册驱动)
  3. controller.java
  4. ```java
  5. //注册一个全局日期处理注解
  6. @InitBinder
  7. public void InitBinder(WebDataBinder webDataBinder){
  8. webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sf,true));
  9. }
  10. @RequestMapping("/mydate")
  11. public String mydate(
  12. @DateTimeFormat(pattern = "yyyy-MM-dd")
  13. Date mydate) {
  14. System.out.println(mydate);
  15. System.out.println(sf.format(mydate));
  16. return "show";
  17. }
  • 一定不要忘记注解 ```java @InitBinder public void initBinder(WebDataBinder dataBinder){
    1. dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(sf,true));
    }
  1. <a name="sq2kQ"></a>
  2. ## 日期显示处理
  3. <a name="mMHG9"></a>
  4. ### 显示单个日期
  5. controller.java
  6. ```java
  7. //类中全局日期处理
  8. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
  9. // /**
  10. // * 日期:<input type="date" name="mydate"><br>
  11. // *
  12. // */
  13. //注册一个全局日期处理注解
  14. @InitBinder
  15. public void InitBinder(WebDataBinder webDataBinder){
  16. webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sf,true));
  17. }
  18. @RequestMapping("/mydate")
  19. public String mydate(Date mydate, HttpServletRequest request) {
  20. System.out.println(mydate);
  21. System.out.println(sf.format(mydate));
  22. // 显示单个日期,实际上日期的类型是一个字符串而不是日期类型
  23. request.setAttribute("mydate",sf.format(mydate));
  24. return "show";
  25. }

2.show.jsp

  1. <br>
  2. 显示单个日期:${mydate}

日期集合显示

2)日期的显示处理
在页面上显示好看的日期,必须使用JSTL.
步骤:
A)添加依赖jstl

jstl
jstl
1.2

  1. B)在页面上导入标签库 <br /> 如果是单个日期对象,直接转为好看的格式化的字符串进行显示.<br /> 如果是list中的实体类对象的成员变量是日期类型,则必须使用jstl进行显示.<br /> <%--导入jstl核心标签库--%><br /> <%@taglib prefix="c" uri="[http://java.sun.com/jsp/jstl/core"](http://java.sun.com/jsp/jstl/core") %><br /> <%--导入jstl格式化标签库--%><br /> <%@taglib prefix="fmt" uri="[http://java.sun.com/jsp/jstl/fmt"](http://java.sun.com/jsp/jstl/fmt") %>
  2. C)使用标签显示数据 <br /> <table width="800px" border="1"><br /> <tr><br /> <th>姓名</th><br /> <th>生日</th><br /> </tr><br /> <c:forEach items="${list}" var="stu"><br /> <tr><br /> <td>${stu.name}</td><br /> <td>${stu.birthday}------ <fmt:formatDate value="${stu.birthday}" pattern="yyyy-MM-dd"></fmt:formatDate></td><br /> </tr><br /> </c:forEach><br />1.show.jsp
  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 86155
  4. Date: 2022/4/18
  5. Time: 13:47
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <%--导入jstl核心标签库--%>
  10. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  11. <%--导入jstl格式化标签库--%>
  12. <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  13. <html>
  14. <head>
  15. <title>Title</title>
  16. </head>
  17. <body>
  18. <h2>show....</h2>
  19. <br>
  20. 显示单个日期:${mydate}
  21. <br><br><br>
  22. <h2>学生集合</h2>
  23. <table width="800px" border="1" >
  24. <tr>
  25. <th>姓名</th>
  26. <th>生日</th>
  27. </tr>
  28. <c:forEach items="${list}" var="stu">
  29. <tr>
  30. <th>${stu.name}</th>
  31. <th>${stu.birthday}----- <fmt:formatDate value="${stu.birthday}" pattern="yyyy-MM-dd"></fmt:formatDate> </th>
  32. </tr>
  33. </c:forEach>
  34. </table>
  35. </body>
  36. </html>

2,controller.java

  1. }
  2. @RequestMapping("/list")
  3. public String list(HttpServletRequest request) throws ParseException {
  4. Student stu1 = new Student("张三",sf.parse("2000-01-01"));
  5. Student stu2 = new Student("李四",sf.parse("2001-01-01"));
  6. Student stu3 = new Student("王五",sf.parse("2002-01-01"));
  7. List<Student>list =new ArrayList<>();
  8. list.add(stu1);
  9. list.add(stu2);
  10. list.add(stu3);
  11. request.setAttribute("list",list);
  12. return "show";
  13. }
  14. }

3.main.jsp

  1. <a href="${pageContext.request.contextPath}/list.action">显示集合中学生信息</a>

日期处理(对象)

1.Student.java

  • 在对象和set方法添加注解@DateTimeFormat(pattern = “yyyy-MM-dd”)

    1. @DateTimeFormat(pattern = "yyyy-MM-dd")

    image.png
    2.如果是json对象就在get方法上添加注解

    springmvc的执行流程

    image.png

    的用法

    image.png

    请求转发访问web-inf文件夹

    1.web -inf目录是不能直接访问的,可以先跳转到action 然后在action里面跳转到web-inf的目录下的jsp 页面
    2.controller.java

    1. @Controller
    2. public class WebInfAction {
    3. @RequestMapping("/showIndex")
    4. public String showIndex(){
    5. System.out.println("访问index页面");
    6. return "index";
    7. }
    8. @RequestMapping("/main")
    9. public String main(){
    10. System.out.println("访问main页面");
    11. return "main";
    12. }
    13. }

    3.springmvc.xml文件(修改默认的路径,不然就要自己手动加上路径)
    image.png
    4.文件结构(原有的index页面一定要存在)
    image.png

    去掉后缀访问

    image.png
    image.png
    image.png

    springmvc拦截器

    4.SpringMVC的拦截器
    针对请求和响应进行的额外的处理.在请求和响应的过程中添加预处理,后处理和最终处理.

    15.拦截器执行的时机
    1)preHandle():在请求被处理之前进行操作,预处理
    2)postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果,后处理
    3)afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源 ,最终处理.

16.拦截器实现的两种方式
1)继承HandlerInterceptorAdapter的父类
2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式

17.拦截器实现的步骤
1)改造登录方法,在session中存储用户信息,用于进行权限验证
@RequestMapping(“/login”)
public String login(String name, String pwd, HttpServletRequest request){
if(“zar”.equalsIgnoreCase(name) && “123”.equalsIgnoreCase(pwd)){
//在session中存储用户信息,用于进行权限验证
request.getSession().setAttribute(“users”,name);
return “main”;
}else{
request.setAttribute(“msg”,”用户名或密码不正确!”);
return “login”;
}
}
2)开发拦截器的功能.实现HandlerInterceptor接口,重写preHandle()方法
if(request.getSession().getAttribute(“users”) == null){
//此时就是没有登录,打回到登录页面,并给出提示
request.setAttribute(“msg”,”您还没有登录,请先去登录!”);
request.getRequestDispatcher(“/WEB-INF/jsp/login.jsp”).forward(request,response);
return false;
}
return true;//放行请求
3)在springmvc.xml文件中注册拦截器











具体代码:
1.controller.java

  1. @Controller
  2. public class WebInfAction {
  3. @RequestMapping("/showIndex")
  4. public String showIndex(){
  5. System.out.println("访问index页面");
  6. return "index";
  7. }
  8. @RequestMapping("/main")
  9. public String main(){
  10. System.out.println("访问main页面");
  11. return "main";
  12. }
  13. @RequestMapping("/showLogin")
  14. public String showLogin(){
  15. System.out.println("访问showLogin页面");
  16. return "login";
  17. }
  18. @RequestMapping("/login")
  19. public String login(String name, String pwd, HttpServletRequest request){
  20. if ("may".equalsIgnoreCase(name)&&"1234".equalsIgnoreCase(pwd)){
  21. //将用户信息存到session作用域当中
  22. request.getSession().setAttribute("users",name);
  23. return "main" ;
  24. }else {
  25. request.setAttribute("msg","登录失败!用户名或密码不正确");
  26. return "login";
  27. }
  28. }
  29. }

2.springmvc.xml文件中拦截器

<!--     注册拦截器   -->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            映射要拦截的请求-->
            <mvc:mapping path="/**"/>
<!--            设置放行的请求-->
            <mvc:exclude-mapping path="/showLogin"/>
            <mvc:exclude-mapping path="/login"/>
<!--            配置具体的拦截器实现的功能类-->
            <bean class="com.bjpowernode.controller.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3.拦截器代码:

//可以实现接口也可以继承类 ,但是优先实现接口
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        验证是否登录
        if (request.getSession().getAttribute("users")==null){
            //在登录页面上打印信息
            request.getSession().setAttribute("msg","你还没有登录,请先登录!");
            //请求转发
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
            return false;//false 是不放行打回原来的位置
        }
     return true;//放行
    }
}

ssm整合

分页:limit (当前页面-1)* 每页条数,每页条数

常见的问题

Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]

  • 初始化路径

    .${pageContext.request.contextPath}

    image.png

    webapp没有小蓝点建不了jsp文件

    image.png
    image.png

    .FileNotFoundException: class path resource [springmvc.xml] cannot be opened because it does not exist

  • 这个问题经常遇到,一定一定要注意!!血的教训

  • 出现这个问题是没有检测到springmvc.xml文件,可能没有编译,没有编译的原因可能是那个resources文件夹没有变成资源文件夹
  • image.png

注意注意!!

Plugin ‘org.apache.maven.plugins:maven-compiler-plugin:’ not found

  • 可能是这里没有加上版本号要加上多 退出多试几遍

image.png