• 【狂神】SpringMVC笔记(一)之详细版


    1.Restful 风格

    概念:

    实现方式:

    使用@PathVariable

    在url相同的情况下,会根据请求方式的不同来执行不同的方法。

    使用RestFull风格的好处:简洁、高效、安全

    2、接受请求参数及数据回显

    2.1、请求参数

    方式一:这里的@RequestParam("username")意思是,将前端用username="xxx"的值传到name变量里。

     方式二:当接受的对象是一个对象时,那我们在前端传入的变量名应与实体类中的名字保持一致,否则就为null

     2.2、数据回显

    也有三种方式,分别是Model,ModelMap,ModelAandView

    这个是第三种的。

     tips:

    3、乱码问题

    我以为我的配置是最优的,结果... 果然,人就是不能乱飘。

    先建个包,再建个类,专门用于存放过滤器的代码,用以解决乱码的问题。代码如下:

    1. package com.zhang.Filter;
    2. import javax.servlet.*;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletRequestWrapper;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.UnsupportedEncodingException;
    8. import java.util.Map;
    9. public class GenericEncodingFilter implements Filter {
    10. @Override
    11. public void destroy() {
    12. }
    13. @Override
    14. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException, IOException {
    15. //处理response的字符编码
    16. HttpServletResponse myResponse=(HttpServletResponse) response;
    17. myResponse.setContentType("text/html;charset=UTF-8");
    18. // 转型为与协议相关对象
    19. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    20. // 对request包装增强
    21. HttpServletRequest myrequest = new MyRequest(httpServletRequest);
    22. chain.doFilter(myrequest, response);
    23. }
    24. @Override
    25. public void init(FilterConfig filterConfig) throws ServletException {
    26. }
    27. }
    28. //自定义request对象,HttpServletRequest的包装类
    29. class MyRequest extends HttpServletRequestWrapper {
    30. private HttpServletRequest request;
    31. //是否编码的标记
    32. private boolean hasEncode;
    33. //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
    34. public MyRequest(HttpServletRequest request) {
    35. super(request);// super必须写
    36. this.request = request;
    37. }
    38. // 对需要增强方法 进行覆盖
    39. @Override
    40. public Map getParameterMap() {
    41. // 先获得请求方式
    42. String method = request.getMethod();
    43. if (method.equalsIgnoreCase("post")) {
    44. // post请求
    45. try {
    46. // 处理post乱码
    47. request.setCharacterEncoding("utf-8");
    48. return request.getParameterMap();
    49. } catch (UnsupportedEncodingException e) {
    50. e.printStackTrace();
    51. }
    52. } else if (method.equalsIgnoreCase("get")) {
    53. // get请求
    54. Map parameterMap = request.getParameterMap();
    55. if (!hasEncode) { // 确保get手动编码逻辑只运行一次
    56. for (String parameterName : parameterMap.keySet()) {
    57. String[] values = parameterMap.get(parameterName);
    58. if (values != null) {
    59. for (int i = 0; i < values.length; i++) {
    60. try {
    61. // 处理get乱码
    62. values[i] = new String(values[i]
    63. .getBytes("ISO-8859-1"), "utf-8");
    64. } catch (UnsupportedEncodingException e) {
    65. e.printStackTrace();
    66. }
    67. }
    68. }
    69. }
    70. hasEncode = true;
    71. }
    72. return parameterMap;
    73. }
    74. return super.getParameterMap();
    75. }
    76. //取一个值
    77. @Override
    78. public String getParameter(String name) {
    79. Map parameterMap = getParameterMap();
    80. String[] values = parameterMap.get(name);
    81. if (values == null) {
    82. return null;
    83. }
    84. return values[0]; // 取回参数的第一个值
    85. }
    86. //取所有值
    87. @Override
    88. public String[] getParameterValues(String name) {
    89. Map parameterMap = getParameterMap();
    90. String[] values = parameterMap.get(name);
    91. return values;
    92. }
    93. }

    然后再在web.xml中进行相关配置

    1. <filter>
    2. <filter-name>encodingfilter-name>
    3. <filter-class>com.zhang.Filter.GenericEncodingFilterfilter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>encodingfilter-name>
    7. <url-pattern>/*url-pattern>
    8. filter-mapping>

    4、JSON

    4.1、概念:

     在前端页面json和js对象的相互转换:

     4、JSON

    这里需要注意的是@RestController 注解会自动将返回值转换为JSON或XML格式的响应。

    4.1、注解RestController和Controller的区别如下:

     注意@RestController=Controller+ResponseBody,二者可以组合起来搭配使用。用RestController注解返回的就只是一个JSON风格的字符串。

     4.2、一个小案例

    我的jdk版本是1.8。

    1.建立一个实体类User。

    1. package com.zhang.pojo;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @Data //需要导入lomb的相关依赖
    6. @AllArgsConstructor //有参构造
    7. @NoArgsConstructor //无参构造
    8. public class User {
    9. private String name;
    10. private int age;
    11. private String sex;
    12. }

    2.导入pom.xml的相关依赖。

    1. <dependencies>
    2. <dependency>
    3. <groupId>junitgroupId>
    4. <artifactId>junitartifactId>
    5. <version>4.12version>
    6. <scope>testscope>
    7. dependency>
    8. <dependency>
    9. <groupId>org.springframeworkgroupId>
    10. <artifactId>spring-webmvcartifactId>
    11. <version>5.3.4version>
    12. dependency>
    13. <dependency>
    14. <groupId>javax.servletgroupId>
    15. <artifactId>servlet-apiartifactId>
    16. <version>2.5version>
    17. dependency>
    18. <dependency>
    19. <groupId>javax.servletgroupId>
    20. <artifactId>jstlartifactId>
    21. <version>1.2version>
    22. dependency>
    23. <dependency>
    24. <groupId>com.fasterxml.jackson.coregroupId>
    25. <artifactId>jackson-databindartifactId>
    26. <version>2.9.8version>
    27. dependency>
    28. <dependency>
    29. <groupId>org.projectlombokgroupId>
    30. <artifactId>lombokartifactId>
    31. <version>1.18.26version>
    32. <scope>compilescope>
    33. dependency>
    34. dependencies>
    35. <build>
    36. <resources>
    37. <resource>
    38. <directory>src/main/javadirectory>
    39. <includes>
    40. <include>**/*.propertiesinclude>
    41. <include>**/*.xmlinclude>
    42. includes>
    43. <filtering>falsefiltering>
    44. resource>
    45. <resource>
    46. <directory>src/main/resourcesdirectory>
    47. <includes>
    48. <include>**/*.propertiesinclude>
    49. <include>**/*.xmlinclude>
    50. includes>
    51. <filtering>falsefiltering>
    52. resource>
    53. resources>
    54. build>

    3.在springmvc-servlet.xml中导入相关的解决json乱码的问题。

    1. <context:component-scan base-package="com.zhang.controller"/>
    2. <mvc:default-servlet-handler />
    3. <mvc:annotation-driven />
    4. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    5. id="internalResourceViewResolver">
    6. <property name="prefix" value="/WEB-INF/jsp/" />
    7. <property name="suffix" value=".jsp" />
    8. bean>
    9. <mvc:annotation-driven>
    10. <mvc:message-converters register-defaults="true">
    11. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    12. <constructor-arg value="UTF-8"/>
    13. bean>
    14. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    15. <property name="objectMapper">
    16. <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
    17. <property name="failOnEmptyBeans" value="false"/>
    18. bean>
    19. property>
    20. bean>
    21. mvc:message-converters>
    22. mvc:annotation-driven>

    4.在web.xml中导入相关依赖。

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>SpringMVCservlet-name>
    8. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    9. <init-param>
    10. <param-name>contextConfigLocationparam-name>
    11. <param-value>classpath:springmvc-servlet.xmlparam-value>
    12. init-param>
    13. <load-on-startup>1load-on-startup>
    14. servlet>
    15. <servlet-mapping>
    16. <servlet-name>SpringMVCservlet-name>
    17. <url-pattern>/url-pattern>
    18. servlet-mapping>
    19. <filter>
    20. <filter-name>encodingfilter-name>
    21. <filter-class>com.zhang.Filter.GenericEncodingFilterfilter-class>
    22. filter>
    23. <filter-mapping>
    24. <filter-name>encodingfilter-name>
    25. <url-pattern>/*url-pattern>
    26. filter-mapping>
    27. web-app>

    5.建立一个controller类进行测试就可以了

    1. import com.zhang.pojo.User;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. @RestController
    6. public class UserController {
    7. @RequestMapping("/json1")
    8. public String json1() throws JsonProcessingException {
    9. ObjectMapper mapper=new ObjectMapper();
    10. User user=new User("章鱼卷",1,"女");
    11. String str=mapper.writeValueAsString(user);
    12. return str;
    13. }
    14. }

    6.EEROR 记得lib下要导入相关的jar包呀,不然会报500的错的

     5、ssm整合:Mybatis层

    学习就是苦中作乐,加油呀!我还有4天就开学了,呜呜呜,好快!

  • 相关阅读:
    python基于PHP+MySQL的图书馆自习室预约占座系统
    LeetCode刷题系列 -- 652. 寻找重复的子树
    pycharm2022.2 远程连接服务器调试代码
    uniapp中vue3使用uni.createSelectorQuery().in(this)报错
    10道不得不会的Docker面试题
    笔试强训(三十八)
    深度学习环境配置(tensorflow、anaconda、pycharm)
    JavaSE学习--数据类型和运算符
    java毕业生设计中小学图书馆管理计算机源码+系统+mysql+调试部署+lw
    如何构建Hive数据仓库Hive 、数据仓库的存储方式 以及hive数据的导入导出
  • 原文地址:https://blog.csdn.net/qq_62649563/article/details/132689373