SpringMVC学习笔记+整合SSM框架

一、MVC

模型(dao、service)、视图(jsp)、控制器(servlet)

二、Servlet

1. 导入servlet 和 jsp 的 jar 依赖

javax.servletservlet-api2.5

javax.servlet.jspjsp-api2.2

2. 编写一个Servlet类,用来处理用户的请求,继承HttpServlet的Java类

public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);//1.获取前端参数String method = req.getParameter("method");if (method.equals("add")){req.getSession().setAttribute("msg","执行了add方法");}if (method.equals("delete")){req.getSession().setAttribute("msg","执行了delete方法");}//2.调用业务层//3.视图转发或重定向req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);doGet(req, resp);}
}

3. 在web.xml中注册servlet

    hellocom.lzq.servlet.HelloServlethello/hello

4. 提交表单测试(url:http://localhost:8080/hello?method=add)


三、SpringMVC

SpringMVC围绕DispatcherServlet设计,DispatcherServlet的作用是将请求分发到不同的处理器。

3.1 SpringMVC原理

发起请求时被前端控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。、

3.2 SpringMVC执行流程 

 

3.3 Hello SpringMVC

3.3.1 配置版

1. 配置web.xml,注册DispatcherServlet

    springmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc-servlet.xml1springmvc/

2. 在resource目录下编写SpringMVC的配置文件!名称:springmvc-servlet.xml  : [servletname]-servlet.xml


3. 编写要操作业务Controller ,要么实现Controller接口,要么增加注解@Controller;需要返回一个ModelAndView,装数据,封视图

//注意:这里我们先导入Controller接口
public class HelloController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {//ModelAndView 模型和视图ModelAndView mv = new ModelAndView();//业务代码String result = "HelloSpringMVC!";//封装对象,放在ModelAndView中。Modelmv.addObject("msg",result);//封装要跳转的视图,放在ModelAndView中mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jspreturn mv;}}

4. 将Controller类交给SpringIOC容器,注册bean

5. 写要跳转的jsp页面hello.jsp,显示ModelandView存放的数据

6. 配置Tomcat 启动测试,http://localhost:8080/hello

可能遇到的问题:访问出现404,排查:

1. 查看控制台输出,看一下是不是缺少了什么jar包;

2.如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖!

 3.3.2 注解版

1. 配置web.xml,注册DispatcherServlet,同上

2. 添加Spring MVC配置文件,为了支持基于注解的IOC,设置了自动扫描包的功能

在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。


3. 编写Controller类,增加注解@Controller

@Controller
@RequestMapping("/HelloController")
public class HelloController {//真实访问地址 : 项目名/HelloController/hello@RequestMapping("/hello")public String sayHello(Model model){//向模型中添加属性msg与值,可以在JSP页面中取出并渲染model.addAttribute("msg","hello,SpringMVC");//web-inf/jsp/hello.jspreturn "hello";//视图解析器处理,跳转到hello.jsp}
}

@Controller,代表这个类会被Spring接管,让Spring IOC容器初始化时自动扫描到,被这个注解的类中的所有方法,如果返回值是string,并且有具体页面可以跳转,那么就会被视图解析器解析

@RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/HelloController/hello

4. 写要跳转的jsp页面hello.jsp,显示ModelandView存放的数据

5. 配置Tomcat 启动测试,http://localhost:8080/HelloController/hello

3.3.3 两种方法总结

接口版缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦。

注解版可以在一个控制器中实现多个方法,只要请求地址映射不一样即可。

@Controller注解类型用于声明Spring类的实例是一个控制器。

(另外3个注解:@Service、@Component、@Repository)

3.4 RestFul 风格

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制,安全

1. 在SpringMVC中可以使用  @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。

@Controller
@RequestMapping("/HelloController")
public class HelloController {//原来:http://localhost:8080/HelloController/add?a=1&b=2@RequestMapping("/add")public String add(int a, int b, Model model){int res = a+b;model.addAttribute("msg","a+b="+res);return "hello";//视图解析器处理,跳转到hello.jsp}//RestFul:http://localhost:8080/HelloController/add2/1/2@RequestMapping("/add2/{a}/{b}")public String addRestFul(@PathVariable int a, @PathVariable int b, Model model){int res = a+b;model.addAttribute("msg","a+b="+res);return "hello";//视图解析器处理,跳转到hello.jsp}
}

2. 使用method属性指定请求类型,指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等。

请求地址映射一样,但请求方法不同会调用相对应请求方法的请求,例如表单中method=post,则会调用method = RequestMethod.POST的请求。

所有的地址栏请求默认都会是 HTTP GET 类型的。

    @RequestMapping(value = "/add2/{a}/{b}", method = RequestMethod.GET)//@GetMapping("/add2/{a}/{b}")  //等价于上面//还有PostMapping等public String add3(@PathVariable int a, @PathVariable int b, Model model){int res = a+b;model.addAttribute("msg","a+b="+res);return "hello";//视图解析器处理,跳转到hello.jsp}

3.5 SpringMVC中转发和重定向

    //转发,无需视图解析器,有的话无视@RequestMapping("/test2")public String test2(Model model){model.addAttribute("msg","test2");return "forward:/WEB-INF/jsp/hello.jsp";//视图解析器处理,跳转到hello.jsp}//重定向,无需视图解析器,有的话无视@RequestMapping("/test3")public String test3(Model model){return "redirect:/index.jsp";}

ps:普通方式

转发:request.getRequestDispatcher("/test.jsp").forword(request,response);

重定向:response.sendRedirect("/test.jsp");

3.6 数据处理

3.6.1处理提交数据

1. 提交的域名称和处理方法的参数名不一致

提交数据 : http://localhost:8080/hello?username=lzq

处理方法 :

//@RequestParam("username") : username提交的域的名称
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){System.out.println(name);return "hello";
}

ps:username为表单中的name属性!!!不是id属性!!! 

2. 提交的是一个对象 

要求提交的表单域和对象的属性名一致  , 参数使用对象即可

提交数据 : http://localhost:8080/user?name=lzq&id=1

处理方法 :

@RequestMapping("/user")
public String user(User user){System.out.println(user);return "hello";
}

3.6.2数据显示到前端

1. ModelAndView        mv.addObject("msg","ControllerTest1");

2. Model        model.addAttribute("msg",name);

3. ModelMap        model.addAttribute("msg",name);

3.7 Json交互处理

  • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式

  • 采用完全独立于编程语言的文本格式来存储和表示数据。

  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON 键值对是用来保存 JavaScript 对象的一种方式

var obj = {a: 'Hello', b: 'World'}; //这是一个js对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

json解析工具:jackson、fastjson

3.7.1 jackson

依赖包

com.fasterxml.jackson.corejackson-databind2.9.8

测试,两个新东西,一个是@ResponseBody,一个是ObjectMapper对象

    //jackson@RequestMapping(value = "/json1")  //解决json乱码:produces = "application/json;charset=utf-8"@ResponseBody   //不会返回给视图解析器,直接返回Stringpublic String json1() throws JsonProcessingException {//创建一个jackson的对象映射器,用来解析数据ObjectMapper mapper = new ObjectMapper();//创建一个对象User user = new User(1, "刘zq");//将我们的对象解析成为json格式String str = mapper.writeValueAsString(user);//由于@ResponseBody注解,这里会将str转成json格式返回return str;}//jackson@RequestMapping(value = "/json2")  //解决json乱码:produces = "application/json;charset=utf-8"@ResponseBody   //不会返回给视图解析器,直接返回Stringpublic String json2() throws JsonProcessingException {//创建一个jackson的对象映射器,用来解析数据ObjectMapper mapper = new ObjectMapper();Date date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-mm-dd HH:mm:ss");return mapper.writeValueAsString(simpleDateFormat.format(date));}

json乱码问题,设置编码格式为utf-8,以及返回的类型; 

//produces:指定响应体返回类型和编码
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")

或者在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置。

    

3.7.2 fastjson

依赖包

    com.alibabafastjson1.2.79

测试

    //fastjson@RequestMapping(value = "/json3")  //解决json乱码:produces = "application/json;charset=utf-8"@ResponseBody   //不会返回给视图解析器,直接返回Stringpublic String json3(){//创建一个对象User user = new User(1, "刘zq");return JSON.toJSONString(user);}
@RestController//不会被视图解析器解析,直接返回String,常用在类上,同@ResponseBody(常用在方法上)

3.8 Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。

jQuery 是一个js库,提供多个与 AJAX 有关的方法。jQuery Ajax本质就是 XMLHttpRequest,对他进行了封装,方便调用。

Ajax实现 登录提示效果:

1. 编写一个AjaxController

@RestController
public class AjaxController {@RequestMapping("/a3")public String ajax3(String name,String pwd){String msg = "";//模拟数据库中存在数据if (name!=null){if ("admin".equals(name)){msg = "OK";}else {msg = "用户名输入错误";}}if (pwd!=null){if ("123456".equals(pwd)){msg = "OK";}else {msg = "密码输入有误";}}return msg; //由于@RestController注解,将msg转成json格式返回}
}

2. 前端页面 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

ajax<%--导入jquery , 可以使用在线的CDN , 也可以下载导入--%><%----%>


用户名:

密码:

3. 效果

3.9 拦截器

过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用

  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用

  • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

想要自定义拦截器,必须实现 HandlerInterceptor 接口

实现验证用户是否登录 (认证用户),如果用户已经登陆,放行, 如果用户未登陆,跳转到登陆页面:

1. 编写用户拦截请求类

@Controller
@RequestMapping("/user")
public class UserInterceptorController {//跳转到登陆页面@RequestMapping("/toLogin")public String toLogin(){return "/login";}//跳转到成功页面@RequestMapping("/toSuccess")public String toSuccess(){return "success";}//登陆提交,跳转到成功页面@RequestMapping("login")public String login(String username, HttpSession session){// 向session记录用户身份信息System.out.println("接收前端==="+username);session.setAttribute("user", username);return "success";}//退出登陆@RequestMapping("logout")public String logout(HttpSession session){// session 过期session.removeAttribute("user");return "redirect:/index.jsp";}
}

2. 首页 index.jsp

登录页面
登录成功页面

3. 登陆页面提交表单 login.jsp

用户名:

密 码:

4. 登陆成功页面 success.jsp

登录成功页面


${user}

注销

5. 自定义拦截器类

public class LoginInterceptor implements HandlerInterceptor {//在请求处理的方法之前执行//如果返回true执行下一个拦截器//如果返回false就不执行下一个拦截器@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("------------处理前------------");// 如果是登陆页面则放行System.out.println("url: " + request.getRequestURI());if (request.getRequestURI().contains("login")) {System.out.println("登陆页面放行");return true;}// 如果用户已登陆也放行HttpSession session = request.getSession();if(session.getAttribute("user") != null) {System.out.println("用户已登陆放行");return true;}// 用户没有登陆跳转到登陆页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);System.out.println("拦截");return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("------------处理后------------");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("------------清理------------");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

6. 在Springmvc的配置文件中注册拦截器

    

3.10 文件上传下载

 3.10.1 文件上传

1. 导入文件上传的jar包 commons-fileupload , Maven会自动导入他的依赖包 commons-io包,文件上传时request.getServletContext()方法要求servlet3.0+


commons-fileuploadcommons-fileupload1.4


javax.servletjavax.servlet-api4.0.1provided

2. 配置bean:multipartResolver



3. 前端页面 index.jsp 

为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。

4. FileController

@Controller
public class FileController {//法一//@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象//批量上传CommonsMultipartFile则为数组即可@RequestMapping("/upload")public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {//获取文件名 : file.getOriginalFilename();String uploadFileName = file.getOriginalFilename();//如果文件名为空,直接回到首页!if ("".equals(uploadFileName)){return "redirect:/index.jsp";}System.out.println("上传文件名 : "+uploadFileName);//上传路径保存设置String path = request.getServletContext().getRealPath("/upload");//如果路径不存在,创建一个File realPath = new File(path);if (!realPath.exists()){realPath.mkdir();}System.out.println("上传文件保存地址:"+realPath);InputStream is = file.getInputStream(); //文件输入流OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流//读取写出int len=0;byte[] buffer = new byte[1024];while ((len=is.read(buffer))!=-1){os.write(buffer,0,len);os.flush();}os.close();is.close();return "redirect:/index.jsp";}//法二/** 采用file.Transto 来保存上传的文件*/@RequestMapping("/upload2")public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {//上传路径保存设置String path = request.getServletContext().getRealPath("/upload");File realPath = new File(path);if (!realPath.exists()){realPath.mkdir();}//上传文件地址System.out.println("上传文件保存地址:"+realPath);//通过CommonsMultipartFile的方法直接写文件file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));return "redirect:/index.jsp";}
}

3.10.2 文件下载

1. Controller

@RequestMapping(value="/download")
public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{//要下载的图片地址String  path = request.getServletContext().getRealPath("/upload");String  fileName = "1.jpg";//1、设置response 响应头response.reset(); //设置页面不缓存,清空bufferresponse.setCharacterEncoding("UTF-8"); //字符编码 utf-8response.setContentType("multipart/form-data"); //二进制传输数据//设置响应头response.setHeader("Content-Disposition","attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));File file = new File(path,fileName);//2、 读取文件--输入流InputStream input=new FileInputStream(file);//3、 写出文件--输出流OutputStream out = response.getOutputStream();byte[] buff =new byte[1024];int index=0;//4、执行 写出操作while((index= input.read(buff))!= -1){out.write(buff, 0, index);out.flush();}out.close();input.close();return null;
}

2. 前端 index.jsp 

请求下载
直接下载

ps 上传下载地址如下:

  

 四、整合SSM

1. 新建Maven项目,添加web的支持

2. 导入相关的pom依赖

    junitjunit4.11testmysqlmysql-connector-java5.1.44com.mchangec3p00.9.5.2org.mybatismybatis3.5.7org.projectlomboklombok1.18.22org.springframeworkspring-webmvc5.3.14org.aspectjaspectjweaver1.9.7org.springframeworkspring-jdbc5.3.14org.mybatismybatis-spring2.0.6javax.servletservlet-api2.5javax.servlet.jspjsp-api2.2javax.servletjstl1.2com.fasterxml.jackson.corejackson-databind2.13.1com.alibabafastjson1.2.79

3. Maven资源过滤设置

src/main/java**/*.properties**/*.xml

 4. 建立基本结构和配置框架

  • com.lzq.pojo(M)

  • com.lzq.dao(M)

  • com.lzq.service(M)

  • com.lzq.controller(C)

  • /WEB-INF/jsp(V)

  • Mybatis配置文件,mybatis-config.xml


  • Spring配置文件,applicationContext.xml 

4.1 Mybatis层

1. 数据库配置文件 database.properties

jdbc.driver=com.mysql.jdbc.Driver
#mysql8.0+ url需要配置时区 &serverTimezone=Aisa/Shanghai
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

2. 编写MyBatis的核心配置文件 mybatis-config.xml



3. 编写数据库对应的实体类 com.lzq.pojo.Books 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {private int bookID;private String bookName;private int bookCounts;private String detail;
}

4. 编写Dao层的Mapper接口 

public interface BookMapper {//增加一本书int addBook(Books book);//根据id删除一本书int deleteBookById(@Param("bookID") int id);//修改一本书int updateBook(Books book);//根据id查询一本书Books queryBookById(@Param("bookID") int id);//查询全部书List queryAllBook();//模糊查询//@Select("select * from ssmbuild.books where bookName like '%${bookName}%'")//@Select("select * from ssmbuild.books where bookName like concat('%',#{bookName},'%')")List queryLikeBook(@Param("bookName") String name);
}

5. 编写接口对应的 BookMapper.xml 文件,需要导入MyBatis的包



insert into ssmbuild.books (bookName,bookCounts,detail)values (#{bookName},#{bookCounts},#{detail});delete from ssmbuild.book where bookID=#{bookID}update ssmbuild.bookset bookName=#{bookName}, bookCounts=#{bookCounts}, detail=#{detail}where bookID=#{bookID}

6. 编写Service层的接口

//BookService:底下需要去实现,调用dao层
public interface BookService {//增加一本书int addBook(Books book);//根据id删除一本书int deleteBookById(int id);//修改一本书int updateBook(Books book);//根据id查询一本书Books queryBookById(int id);//查询全部书List queryAllBook();
}

7. 编写Service层接口的实现类,调用Dao层

public class BookServiceImpl implements BookService{//调用dao层的操作,设置一个set接口,方便Spring管理private BookMapper bookMapper;public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int addBook(Books book) {return bookMapper.addBook(book);}@Overridepublic int deleteBookById(int id) {return bookMapper.deleteBookById(id);}@Overridepublic int updateBook(Books book) {return bookMapper.updateBook(book);}@Overridepublic Books queryBookById(int id) {return bookMapper.queryBookById(id);}@Overridepublic List queryAllBook() {return bookMapper.queryAllBook();}
}

4.2 Spring层

1. 编写Spring整合Mybatis的配置文件 spring-dao.xml


2. Spring整合Service层的配置文件 spring-service.xml 


4.3 SpringMVC层

1. 配置 web.xml


DispatcherServletorg.springframework.web.servlet.DispatcherServletcontextConfigLocation  classpath:applicationContext.xml1DispatcherServlet/encodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingutf-8encodingFilter/*15

2. 配置 spring-mvc.xml


    

3. Spring配置整合文件 applicationContext.xml


4.4 Controller层 & 视图层

1.  编写请求控制类BookController

@Controller
@RequestMapping("/book")
public class BookController {@Autowired
//    或者
//    private BookServiceImpl bookServiceImpl = new BookServiceImpl();@Qualifier("bookServiceImpl")private BookServiceImpl bookServiceImpl;//查询全部书@RequestMapping("/allBook")public String allBook(Model model) {List booksList = bookServiceImpl.queryAllBook();model.addAttribute("booksList", booksList);return "/allBook";}//增加一本书@RequestMapping("/toAddBook")public String toAddBook() {return "addBook";}@RequestMapping("/addBook")public String addBook(Books book) {bookServiceImpl.addBook(book);return "redirect:/book/allBook";}//修改一本书@RequestMapping("/toUpdateBook")public String toUpdateBook(Model model, int id) {Books books = bookServiceImpl.queryBookById(id);model.addAttribute("book", books);return "updateBook";}@RequestMapping("/updateBook")public String updateBook(Model model, Books book) {bookServiceImpl.updateBook(book);
//        Books books = bookServiceImpl.queryBookById(book.getBookID());
//        model.addAttribute("books", books);return "redirect:/book/allBook";}//删除一本书@RequestMapping("/delete/{bookId}")public String deleteBook(@PathVariable("bookId") int id) {bookServiceImpl.deleteBookById(id);return "redirect:/book/allBook";}//书名模糊查询@RequestMapping("/queryLikeBook")public String queryLikeBook(Model model, String bookName){List booksList = bookServiceImpl.queryLikeBook(bookName);model.addAttribute("booksList", booksList);return "/allBook";}
}

2. 编写首页 index.jsp,跳转到显示全部书籍页面

点击进入图书列表页

3. 显示全部书籍页面 allBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

书籍列表

书籍列表

显示所有书籍新增
书籍编号书籍名字书籍数量书籍详情操作
${book.bookID}${book.bookName}${book.getBookCounts()}${book.getDetail()}修改|删除

4. 添加书籍页面 addBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

新增书籍


新增书籍

书籍名称:


书籍数量:


书籍详情:


5.  修改书籍页面  updateBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

修改信息


修改信息

书籍编号:${book.getBookID()}书籍名称:书籍数量:书籍详情:

依赖

        javax.servletservlet-api2.5javax.servlet.jspjsp-api2.2javax.servletjstl1.2com.fasterxml.jackson.corejackson-databind2.13.1com.alibabafastjson1.2.79

其他

1.项目发布名

http://localhost:8080/"项目名"/"请求requsestmapping"

2. GET和POST区别

一个重大区别:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视;而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点

3. 转发和重定向的区别

转发

request.getRequestDispatcher("/test.jsp").forword(request,response);

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应

重定向

response.sendRedirect("/test.jsp");

客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应

区别:

1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;

2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;

3、是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源

5、发生行为不同:重定向是客户端行为,转发是服务器端行为

 4. 好用推荐

bootstarp可视化布局系统


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部