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

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。Servlet 与Spring MVC中对参数和url请求的处理,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

引言

在 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生态圈支持,这使得其越来越流行。

参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/222005.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!