servlet开发
servlet的使用
一、servlet3.0新特性
注解的支持
@WebServlet
将一个类声明为Servlet
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定的name属性,等价于<servlet-name> 如果没有显式指定,则该Servlet的取值即为类的全限定名。 |
value | String[] | 该属性等价于urlPatterns属性。两个属性不能同时使用。 |
urlPatterns | String[] | 指定一组servlet的URL匹配模式。等价于<url-pattern> 标签。 |
loadOnStartup | int | 指定Servlet的加载顺序,等价于<load-on-startup> 标签。 |
initParams | WeblnitParam[] | 指定一组Servlet初始化参数,等价于<init-param> 标签。 |
asyncSupported | boolean | 声明Servlet是否支持异步操亻乍模式,等价于<async-supported> 标签。 |
description | String | 该Servlet的描述信息,等价于<description> 标签。 |
displayName | String | 该Servlet的显示名,通常配合工具使用等价于<display-name> 标签。 |
@WeblnitParam
为Servlet或者过滤器指定初始化参数,该注解通常不单独使用,而是配合@WebServlet或者@WebFiIter使用
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
name | String | 否 | 指定参数的名字,等价于<param-name> |
value | String | 否 | 指定参数的值,等价于<param-value> |
description | String | 是 | 关于参数的描述,等价于<description> |
@WebFilter
用于将一个类声明为过滤器
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的name属性,等价于<filter-name> |
value | String[] | 该属性等价于urlPatterns属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的URL匹配模式。等价于<url-pattern> 标签。 |
servletNames | String[] | 指定过滤器将应用于哪些Servleto取值是@WebServlet中的name属性的取值,或者是web.xml中<servlet-name> 的取值。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST. |
initParams | WeblnitParam[] | 指定一组过滤器初始化参数,等价于<init-param> 标签。 |
asyncSupported | boolean | 声明过滤器是否支持异步操亻乍模式,等价于<async-supported> 标签。 |
description | String | 该过滤器的描述信息,等价于<description> 标签。 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于<display-name> 标签。 |
@WebListener
该注解用于将类声明为监听器,被@WebListener标注的类必须实现以下至少一个接口:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeLisener
- HttpSessionListener
- HttpSessionAttributeListener
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
value | String | 是 | 该监听器的描述信息 |
@MultipartConfig
为了辅助HttpServletRequest提供的对上传文件的支持。
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
fileSizeThreshold | int | 是 | 当数据量大于该值时,内容将被与入文件。 |
location | Strlng | 是 | 存放生成的文件地址。 |
maxFileSize | long | 是 | 允许上传的文件最大值。默认值为-1,表示没有限制。 |
maxRequestSize | long | 是 | 针对该muItipart/form-data请求的最大数量,默认值为-1,表示没有限制。 |
示例
- New project -> java Enterprise -> 应用服务器选择tomcat ->应用结构选择Web Application(4.0)
- 创建完成后打开右上角add configuration
- 在server标签中的open-browser复选框去掉勾。
- deployment中Application context 把工程名后面的后缀给删掉
@WebServlet(urlPatterns = "/annotation", initParams =
{@WebInitParam(name="uname",value = "zhangsan"),@WebInitParam(name="age",value="19")})
public class AnnotationServletDemo extends HttpServlet {
// doget dopost
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uname = this.getInitParameter("uname");
String age = this.getInitParameter("age");
PrintWriter writer = resp.getWriter();
writer.println("hello servlet!!" + uname + "," + age);
writer.flush();
writer.close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>servlet3.AnnotationServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/old</url-pattern>
</servlet-mapping>
</web-app>
@WebFilter(urlPatterns = "/*", initParams = {@WebInitParam(name="className", value = "filter")})
public class AnnotationFilterDemo implements Filter {
FilterConfig filterConfig;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String className = filterConfig.getInitParameter("className");
System.out.println("go to filter!" + className);
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("out of filter!");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
异步处理的支持
servlet3.0添加添加了异步处理的支持。
在之前的版本中如下图所示,采用的是单对象多线程的方法,每当一个用户请求过来时,从tomcat线程池中,获取一个线程。当业务逻辑阻塞时,线程也将一直阻塞。
在3.0版本以后,如下图所示:servlet对象开启了异步支持,单独开启线程处理业务逻辑,也就是说当逻辑操作超时的时候,不会造成阻塞,因为在逻辑操作之前就已经释放了servlet对象。
文件上传的支持
servlet2.5上传文件的功能是通过第三方jar包的支持
commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar
servlet3.0自带原生上传支持,示例如下
@WebServlet(urlPatterns = "/uploadServlet")
@MultipartConfig
public class UploadServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//创建目录
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
File file = new File(savePath);
//判断上传文件的保存目录是否存在
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath+"目录不存在,需要创建");
//创建目录
file.mkdir();
}
//获取文件
Part img = request.getPart("file");
//文件全路径
String filePath = file.getPath() + File.separator + img.getSubmittedFileName();
//写入文件
img.write(filePath);
//输出信息
PrintWriter out = response.getWriter();
out.println("File Upload : " + filePath);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%>
<html>
<head>
<title>Upload File</title>
</head>
<body>
<h1>Upload File</h1>
<form action="uploadServlet" method="post" enctype="multipart/form-data">
File : <input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
二、servlet4.0新特性
支持http2协议(https)
开启http/2所需要的软件
- tomcat9
- tomcat-native
- OpenSSL
私钥生成命令
genrsa -out localhost-rsa-key.pem 2048
req -new -x509 -key localhost-rsa-key.pem -out localhost-rsa-cert.pem -days 3650
开启Http/2操作步骤
- 下载并解压缩tomcat9,然后执行bin文件夹下面的startup.bat,测试是否正常;
- 进入到conf目录下,设置server.xml文件,把http/1.1改成http/2,注意把倒数第二行删掉,改完之后,保存,重新打开startup.bat,发现启动报错;
- 下载tomcat-native和OpenSSL两个软件;
- 解压缩tomcat-native,并且执行里面的bin目录下的openssl.exe文件,然后把生成秘钥的命令输入进去,发现第二个命令报错;
- 安装OpenSSL软件,并且把安装目录下的bin下的cnf里面的openssl.cnf文件拷贝到C:\Program Files (x86)\Common Files\SSL目录下;
- 再次打开tomcat-native下的openssl.exe文件,再次把两个秘钥命令输入进去,发现一切正常了,注意,第二个命令输入完成之后需要你填写一些信息,不用管,一路回车即可;
- 把生成出来的秘钥和证书文件(在openssl.exe文件同一个目录下)放入到tomcat9的conf目录下即可;
- 复制tomcat-native下面的bin目录下的x64下面的2个文件拷贝到jdk1.8的bin目录下,如果你是32位系统,则拷贝bin目录下的相同文件名的2个文件即可;
- 在tomcat9下,点击启动startup.bat,启动完成,打开浏览器,输入https://localhost:8443,测试是否正常访问;
- 打开IDEA,进行相关配置之后,测试是否能正常启动工程!
服务器推送
概念
指服务器预测性的提前将资源发给浏览器进行缓存,当用户访问到需要这些资源的页面时,就可以直接从缓存中读取,从而加快页面的访问速度,增加用户的体验感。
推送的步骤
- 设置推送资源
PushBuilder pb = request.newPushBuilder();
pb.path("1.jpg");
- 进行推送
pb.push();
上述代码可写在doGet中。
场景:在用户登录的时候进行推送,登录后,直接展示了登陆之前所缓存的资源。
HttpServletMapping
API
方法名称 | 描述 |
---|---|
getMatchValue() | 返回部分URI路径,该路径会导致请求匹配。 |
getPattern() | 返回URL模式的String表示形式。 |
getServletName() | 返回servlet名称的String表示形式。 |
getMappingMatch() | 返回匹配的类型,表示为MappingMatch枚举值,该枚举值将为以下值之一:CONTEXT_ ROOT (根目录)、DEFAULT (默认)、EXACT (精准)、EXTENSION (拓展)或PATH (路径) 。 |
HttpServletMapping的方法返回值与URI的对应关系
URI Path (in quotes) | matchValue | Pattern | mappingMatch |
---|---|---|---|
“” | “” | “” | CONTEXT_ROOT |
“/index.html” | “” | / | DEFAULT |
“/MyServlet” | MyServlet | /MyServlet | EXACT |
“/foo.extension” | foo | * .extension | EXTENSION |
“/path/foo” | foo | /path/* | PATH |
提供HttpFilter
HttpFilter是Filter的子类,实现了http接口。
struts2的使用
一、servlet、struts1.x和struts2.x的关系说明
共同点
➢都是用来作为MVC模型中的Control层;
➢主要功能在于交互式地浏览和修改数据,生成动态Web内容;
struts2.x的简单使用
不同点
➢struts1.x需要继承Action类,和servlet的耦合度很高, 甚至可以看成就是个servlet的封装,而struts2的就是一个javabean, 实现是基于拦截器;
➢servlet和struts1均是单实例、多线程,线程不安全,struts2本身就是多实例、 单
线程的,所以可以说本身就是线程安全的。
二、struts2.x的简单使用
SpringMVC的简单使用
一、运行原理
二、实操
新建maven项目
配置:添加tomcat-server,选择本地。在server中取消从浏览器中打开,在deployment中添加Artifact。
控制台中文乱码问题
添加-Dfile.encoding=UTF-8
后,重启一下idea
依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!--SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!--spring-web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!--servlet相关依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp相关依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--jackson的依赖,如果用2.75以下的版本,就有可能出现兼容性问题-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
web.xml配置文件
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--配置controller的扫描路径-->
<context:component-scan base-package="controller"/>
<!--注解驱动-->
<mvc:annotation-driven/>
<!--SpringMVC的视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
传值方式
后台往前台传
- 1.map
- 2.model
- 3.ModelMap
- 4.ModelAndView(略)
@Controller
public String param(ModelMap modelMap, Map<String,Object> map, Model model){
// modelMap
modelMap.put("name","zhangsan");
modelMap.addAttribute("age", 10);
User user = new User(1001, "liudehua","123123");
modelMap.put("user", user);
// model
model.addAttribute("sex", "female");
// map
map.put("id", 1000);
return "param";
}
前台往后台传
- 1、直接在参数列表中写明数据的变量名,以及通过@RequestParam注解来注入数据;
- 2、直接在参数列表上加上HttpServletRequest对象来获取;
- 3、 使用restful风格, 在请求名上获取
@Controller
public class ReceiveValueController {
@RequestMapping("receive1")
public String receive1(@RequestParam("uname") String username, User user){
System.out.println(username);
System.out.println(user);
return null;
}
@RequestMapping("receive2")
public String receive2(HttpServletRequest request){
System.out.println(request.getParameter("uname"));
System.out.println(request.getParameter("user")); //取不到
return null;
}
@RequestMapping("receive3/{id}")
public String receive3(@PathVariable("id") String uid){
System.out.println(uid);
return null;
}
}
重定向
(一定要带’/’,不然会适配jsp)
- 不带参数
return "redirect:/index"
- 带参数(携带参数)(不推荐,会暴露在地址栏中)
String url = "redirect1?id=1001";
return url;
- 带参数(隐藏参数)(推荐)
@RequestMapping("redirect" )
public String redirect(RedirectAttributes redirectAttributes){
redirectAttributes.addFlashAttribute("name", "zhangsan");
return "redirect:/index"
}
三、整合freemarker
springmvc.xml配置文件
首先注释掉springmvc的视图解析器
然后加上
<bean id="freemarkerConfiguration"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:freemarker.properties" />
</bean>
// 配置freeMarker模板加载地址
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
//视图解析器在/WEB-INF/ftl/路径下扫描视图文件
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<!--设置一些常用的全局变量-->
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
</map>
</property>
</bean>
//对给定的模板片段执行XML转义
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
<!-- 配置freeMarker视图解析器 -->
<bean id="freemakerViewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
// 扫描路径內所有以ftl結尾的文件
<property name="viewNames">
<array>
<value>*.ftl</value>
</array>
</property>
<property name="contentType" value="text/html; charset=UTF-8" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="requestContextAttribute" value="request" />
// 给视图解析器配置优先級,你可以给之前jsp视图解析器的值配为2
<property name="order" value="1" />
</bean>
pom.xml配置文件
添加freemarker的依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.9.RELEASE</version>
</dependency>
文件结构
在src\main\webapp\WEB-INF\目录下创建ftl文件夹,并创建 .ftl文件。
传值
@RequestMapping("show")
public String showEmp(HttpSession session){
List<Emp> empList = findAll();
session. setAttribute("emplist", empList);
return "list.ftl";
}