Servlet 与Spring MVC中对参数和url请求的处理

引言

在 JAVA WEB 的学习中,处理 HTTP 请求最先使用的是 Servlet ,一般使用开源的 Tomcat 作为 WEB 服务器处理 HTTP 请求的操作。到后来学习了 MVC 模型,使用 Spring MVC 开发工程,可以说比之前使用 Servlet 方便很多。但是追根溯源就会发现,之后出现的 MVC 架构和 Servlet 功能相差无几。于是有必要将 Spring MVC 与 Servlet 对比。

Servlet

Servlet服务配置

Servlet 主要的任务有以下几点:

  • 读取显式的 HTTP 请求数据,如 GET/POST 提交的表单;
  • 读取隐式的 HTTP 请求数据,如 cookies 、媒体类型;
  • 处理数据并返回显示数据到客户端;
  • 发送隐式 HTTP 响应到客户端,如设置 cookies、缓存参数。

客户端发送HTTP请求通过url访问后台WEB服务器,需要先在web.xml配置与url对应的servlet解析类,样例代码如下:

<web-app>      
    <servlet>
        <servlet-name>demo</servlet-name>
        <servlet-class>demo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
</web-app>  
Servlet解析客户端数据

通过可以和对应的servlet解析类关联,通过关联servlet class,提供给客户端访问。

创建Servlet class涉及到Servlet的生命周期。具体过程如下:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • Servlet 由 JVM 的垃圾回收器进行垃圾回收的。

通过重写 service() 方法中的 doGet、doPost、doPut、doDelete 等方法处理不同的HTTP请求类型。样例代码如下:

public class servletHandle extends HttpServlet {
	public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{
		String name=req.getParameter("name");
		String age = req.getParameter("age");
		res.setContentType("text/html;charset=UTF-8");
		PrintWriter writer=res.getWriter();
		writer.println("<p><h2>你好"+name+"!此刻你的年纪是"+age+"。</h2></p><hr />"+"<h1>"+msg+"</h1>");
	}
	public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException{
		req.setCharacterEncoding("UTF-8");
		doGet(req,res);
	}
}

客户端发送HTTP请求数据通过HttpServletRequest接收参数,通过HttpServletResponse返回处理后的数据。HttpServletRequest提供了多个接口获取请求中的参数,如 getParameter()、getParameterValues()、getParameterNames()。获取参数处理后可以写入HttpServletResponse返回给客户端,如查询数据库数据、做过滤校验通过setContentType返回对应的数据类型,如HTML、json等。与 MVC 框架中 controller 要做的事情一致。再在servlet添加一个service层,引入jdbc,就可以不用任何架构实现一个简单的 JAVA WEB 项目。

Spring MVC

Spring MVC 所有的请求都会通过前端控制器(front controller) DispatcherServlet 。ispatcherServlet 的任务是将请求发送给 Spring MVC 控制器(controller)。DispatcherServlet 查询一个或多个处理器映射(handler mapping)来确定请求的控制器。处理器映射会根据请求所携带的 URL 信息来进行决策。选择了合适的控制器, DispatcherServlet 会将请求发送给选中的控制器。到了控制器,请求会卸下其负载(用户提交的信息)并耐心等待控制器处理这些信息。控制器在完成逻辑处理后将信息需要返回给用户并在浏览器上显示。这些信息被称为模型(model)。通常用视图( view )以HTML格式展示。控制器将模型数据打包并标示出用于渲染输出的视图名。将请求连同模型和视图名发送回 DispatcherServlet 。

Spring MVC 服务配置

借助于 Servlet 3 规范和 Spring 3.1 的功能增强,这里使用java类配置 DispatcherServlet ,样例代码如下:

WebAppInitializer 配置 DispatcherServlet :

package demo.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{

	@Override
	protected Class<?>[] getRootConfigClasses() {
		// 启用Spring MVC配置
		return new Class<?>[]{RootConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		// 指定配置类
		return new Class<?>[]{WebConfig.class};	}

	@Override
	protected String[] getServletMappings() {
		// 将 DispatcherServlet映射到 "/"
		return new String[]{"/"};
	}
	

}

WebConfig 启用 Spring MVC

package demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc //启用mvc注解
@ComponentScan("demo.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
	
	@Bean
	public ViewResolver viewResolver(){
		//配置JSP视图解析器
		InternalResourceViewResolver resolver=new InternalResourceViewResolver();
		resolver.setPrefix("/WEB-INF/views/");
		resolver.setSuffix(".html");
		resolver.setExposeContextBeansAsAttributes(true);
		return resolver;
	}
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		//配置静态资源处理
		configurer.enable();
	}
}

RootConfig 配置 ComponentScan、Filter 等:

package demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan(basePackages=("demo"),excludeFilters={
		@Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)
	})
public class RootConfig {

}
Spring MVC 解析客户端数据

Spring MVC 控制器允许客户端多种数据发送方式。

  • 通过HttpServletRequest的getParameter获取参数。
  • 通过参数名自动注入对应方法参数。
  • 通过自动注入获取Bean属性。
package demo.controller;

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import demo.model.User;

@RestController
public class demo1 {
	
	@RequestMapping("/test1")
	public String test1(HttpServletRequest request){
		String name=request.getParameter("name");
		String age=request.getParameter("age");
		return name+"'s age"+age;
	}
	
	@RequestMapping("/test2")
	public String test2(@RequestParam("name") String username,String age){
		return username+"'s age"+age;
	}
	
	@RequestMapping("/test3")
	public String test3(@RequestParam("name") String username,String age){
		return username+"'s age"+age;
	}
	
	@RequestMapping("/test4")
	public String test4(User user){
		return user.getName()+"'s age"+user.getAge();
	}

}

Spring MVC通过控制器解析请求数据和url,大大方便程序员开发和各模块之间的解耦。而且背后还拥有强大的spring生态圈支持,这使得其越来越流行。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值