Web开发:基础Web开发的支持

tech2026-09-25  2

基础Web开发的支持

控制器开发JSON的支持RESTful的支持什么是RESTfulSpring Boot对RESTful 的支持快速上手 Web测试的支持 视图(JSP)开发整合JSP项目结构配置文件引入依赖包编写LoginController启动运行 支持热部署 过滤器和拦截器自定义过滤器自定义拦截器

控制器开发

JSON的支持

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、 C#、Java、JavaScript、 Perl、 Python 等),这些特性使JSON成为理想的数据交换语言。

早期人们习惯使用XML进行信息交互,后来JSON 的使用更加简单,到了现在信息交互大部分都以JSON为主。早期在Spring 体系中使用JSON 还比较复杂,需要配置多项XML和注解,现在在Spring Boot体系中,对JSON 支持简单而又完善,在Web层使用仅仅只需要一个注解即可完成。在com.ktjiaoyu.crm.web.controller包下创建控制器UserContollerjava,提供一个getUser方法:

@RestController public class UserController { @Resource private UserService userService; @RequestMapping(value="/getUser",method=RequestMethod.GET) public User getUser(Long userId){ User user=userService.get(userId); return user; } } @RestController注解相当于@ResponseBody + @Controllr 合在一起的作用, 如果Web层的类上使用了@RestController 注解,就代表这个类中所有的方法都会以JSON的形式返回结果,也相当于JSON 的一种快捷使用方式:当然,如果想返回页面继续使用@Controller注解也是可以的。@ RequestMapping(value="/getUser", method= RequestMethod.GET)以/getUser的方式去请求,method= RequestMethod.GET是指只可以使用GET的方式去请求,如果使用POST的方式去请求的话,则会报405不允许访问的错误。

RESTful的支持

什么是RESTful

RESTful是目前最流行的一种互联网软件架构。

Spring Boot对RESTful 的支持

Spring Boot全面支持开发RESTful 程序,通过不同的注解来支持前端的请求,除了经常用的注解外,Spring Boot还提了一些组合注解。这些注解来帮助简化常用的HTTP 方法的明并更好地表达被注解方法的语义。

@GetMapping.处理Get请求。@PostMapping,处理Post 请求。@PutMapping, 用于更新资源。@DeleteMapping, 处理删除请求。@PatchMapping, 用于更新部分资源。

快速上手

请求地址说明GET/users查询所有数据GET/user/id根据id查询数据POST/user新增PUT/user修改DELETE/user/id根据id删除

修改UserController

@RestController public class UserController { @Resource private UserService userService; @GetMapping("/user/{id}") public User getUser(@PathVariable("id") Long userId){ User user=userService.get(userId); return user; } @GetMapping("/users") public List<User> getUserAll(){ List<User> list=userService.getAll(); return list; } @PostMapping("/user") public void addUser(User user){ userService.addUser(user); } @PutMapping("/user") public void updateUser(User user){ userService.updateUser(user); } @DeleteMapping("/user/{id}") public void delUser(@PathVariable("id") Long userId){ userService.deleteUser(userId); } }

Web测试的支持

以往我们在测试Web请求的时候,我们常常会在浏览器中访问一些特定的地址来进行测试,但如果涉及到一些非get 请求就会变的稍微麻烦一些。有的会使用PostMan 工具或者自己写一些HttpPost请求来进行测试。Spring Boot中有对Web测试的解决方案: MockMvc。 MockMvc实现了对Http 请求的模拟,能够直接使用网络的形式,转换到Controller 的调用,这样可以使得测试速度更快、不依赖网络环境,而且提供了一套验证的工具,可以使得请求的验证统-而且更方便。 下面是MockMvc测试类的基本结构:

@RunWith(SpringRunner.class) @SpringBootTest public class UserControllerTester { @Resource private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup(){ this.mockMvc= MockMvcBuilders.webAppContextSetup(this.wac).build(); }

@Before 代表在测试启动时需要提前加载内容,这里是提前加载MVC 环境。

@Test public void testGetUser() throws Exception{ String result=mockMvc.perform(MockMvcRequestBuilders.get("/user/2")) .andReturn().getResponse().getContentAsString(); System.out.println("数据:"+result); } @Test public void testAddUser() throws Exception{ final MultiValueMap<String,String> params=new LinkedMultiValueMap<>(); params.add("userName","小芳"); params.add("userPassword","123456"); params.add("userRoleId","11"); params.add("userFlag","1"); mockMvc.perform(MockMvcRequestBuilders.post("/user").params(params)) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()); }

测试根据id查询数据(get请求)和测试新增(post请求)

测试结果:

perform(…)构建一个请求, 并且返回ResultActions 实例,该实例则可以获取到请求的返回内容等。MockMcRequstiuilrs.xxx(“url”)以某种请求方法发出对某url的请求params构建请求时候的参数,也支持param(key,value)的方式连续添加。andExpect(…)预期结果判断,可以多次调用。andReturn()返回MvcResult 对象,该对象可以获取到返回的视图名称、返回的Response状态、获取拦截请求的拦截器集合。andDo()继续-些操作,例如MockMvcResultHandlers.print()打印响应信息。

视图(JSP)开发

我们掌握了控制器的开发及测试后,接下来学习视图的开发。Spring Boot的默认视图技术是Thymeleaf 模板引擎,但是本次课咱们先还是学习如何使用JSP作为视图。

整合JSP

JSP (Java Server Pages, Java 服务器页面)是一个简化的Servlet 设计,它是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP 技术类似ASP技术,它是在传统的网页HTML (标准通用标记语言的子集)文件(.html) 中插入Java 程序段(Scriptlet) 和JSP标记(tag),从而形成JSP 文件,后缀名为(*.jsp)。用JSP 开发的Web应用是跨平台的,既能在Linux 下运行,也能在其他操作系统上运行。

JSP其实就是Java 为了支持Web开发而推出的类前端Servlet, 可以在JISP 中写Java或者Html语法等,后端根据JSP语法渲染后返回到前端显示,在没有模板引擎之前JSP是Java程序员开发人员的首选,到现在仍然有很多公司使用JSP开发后台管理系统。本节内容将介绍如何在Spring Boot项目中使用JSP。

项目结构

配置文件

spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp

引入依赖包

<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>

编写LoginController

@Controller public class LoginController { @Resource private UserService userService; @RequestMapping("/login") public String dologin(String userName, String userPassword, Model model, HttpSession session){ User user=userService.login(userName, userPassword); if (user!=null){ session.setAttribute(Constants.USER_SESSION,user); return "main"; }else { model.addAttribute("error","用户名或密码错误,登录失败!"); return "login"; } } }

启动运行

要设置启动文件 重启项目就可以正常访问页面进行登录了

支持热部署

添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> 配置IDEA Crl+Shift+A,在输入框输入registry 打开一个界面,选中compiler.automake.allow.when.app.running复选框,选中就好 配置Update classes and resources

过滤器和拦截器

Web项目中,控制器可以处理具体的业务请求,公共功能的处理则可以利用AOP的思想,通过过滤器或拦截器实现。过滤器和拦截器都属于面向切面编程的具体实现。而两者的主要区别包括以下几个方面:

Filter 是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。Filter的生命周期由Servlet容器管理,而拦截器则可以通过loC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

自定义过滤器

Filter也称之为过滤器,可以在前端拦截所有用户的请求。Web开发人员通过Filter 技术,对Web服务器管理的所有Web资源,例如JSP、 Servlet、 控制器、静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能。 例如,实现URL 级别的权限访问控制、 过滤敏感词汇、排除有XSS威胁的字符、记录请求日志等一些高级功能。

Spring Boot内置了一些Filter, 比如, 处理编码的OrderedCharacterEncodingFilter 和请求转化的HiddenttpMethodFilter, 也支持根据我们的需求来可以自定义Filter。

自定义Filter 有两种实现方式,第一种是使用@WebFilter, 第二种是使用FilterRegistrationBean,经过实践之后发现使用@Webilter 自定义的过滤器优先级顺序不能生效(只能根据Filter类名的字母顺序倒序排列,且优先级都高于FilterRegistrationBean 配置的过滤器),因此推荐使用第二个方案。 自定义Filter 两个步骤:

实现Filter 接口,重写其中的doFilte()方法:添加@Configuration 注解,将自定义Filter 加入过滤链。

自定义拦截器

使用拦截器来实现上面同样的功能。 自定义Interceptor 两个步骤:

实现 Interceptor接口,重写其中的三个方法:实现WebMvcConfigurer接口,重写addInterceptors方法,注册拦截器。
最新回复(0)