servlet开发

servlet的使用

一、servlet3.0新特性

注解的支持

@WebServlet

将一个类声明为Servlet

属性名类型描述
nameString指定的name属性,等价于<servlet-name>如果没有显式指定,则该Servlet的取值即为类的全限定名。
valueString[]该属性等价于urlPatterns属性。两个属性不能同时使用。
urlPatternsString[]指定一组servlet的URL匹配模式。等价于<url-pattern>标签。
loadOnStartupint指定Servlet的加载顺序,等价于<load-on-startup>标签。
initParamsWeblnitParam[]指定一组Servlet初始化参数,等价于<init-param>标签。
asyncSupportedboolean声明Servlet是否支持异步操亻乍模式,等价于<async-supported>标签。
descriptionString该Servlet的描述信息,等价于<description>标签。
displayNameString该Servlet的显示名,通常配合工具使用等价于<display-name>标签。
@WeblnitParam

为Servlet或者过滤器指定初始化参数,该注解通常不单独使用,而是配合@WebServlet或者@WebFiIter使用

属性名类型是否可选描述
nameString指定参数的名字,等价于<param-name>
valueString指定参数的值,等价于<param-value>
descriptionString关于参数的描述,等价于<description>
@WebFilter

用于将一个类声明为过滤器

属性名类型描述
filterNameString指定过滤器的name属性,等价于<filter-name>
valueString[]该属性等价于urlPatterns属性。但是两者不应该同时使用。
urlPatternsString[]指定一组过滤器的URL匹配模式。等价于<url-pattern>标签。
servletNamesString[]指定过滤器将应用于哪些Servleto取值是@WebServlet中的name属性的取值,或者是web.xml中<servlet-name>的取值。
dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST.
initParamsWeblnitParam[]指定一组过滤器初始化参数,等价于<init-param>标签。
asyncSupportedboolean声明过滤器是否支持异步操亻乍模式,等价于<async-supported>标签。
descriptionString该过滤器的描述信息,等价于<description>标签。
displayNameString该过滤器的显示名,通常配合工具使用,等价于<display-name>标签。
@WebListener

该注解用于将类声明为监听器,被@WebListener标注的类必须实现以下至少一个接口:

  • ServletContextListener
  • ServletContextAttributeListener
  • ServletRequestListener
  • ServletRequestAttributeLisener
  • HttpSessionListener
  • HttpSessionAttributeListener
属性名类型是否可选描述
valueString该监听器的描述信息
@MultipartConfig

为了辅助HttpServletRequest提供的对上传文件的支持。

属性名类型是否可选描述
fileSizeThresholdint当数据量大于该值时,内容将被与入文件。
locationStrlng存放生成的文件地址。
maxFileSizelong允许上传的文件最大值。默认值为-1,表示没有限制。
maxRequestSizelong针对该muItipart/form-data请求的最大数量,默认值为-1,表示没有限制。
示例
  1. New project -> java Enterprise -> 应用服务器选择tomcat ->应用结构选择Web Application(4.0)
  2. 创建完成后打开右上角add configuration
  3. 在server标签中的open-browser复选框去掉勾。
  4. 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操作步骤
  1. 下载并解压缩tomcat9,然后执行bin文件夹下面的startup.bat,测试是否正常;
  2. 进入到conf目录下,设置server.xml文件,把http/1.1改成http/2,注意把倒数第二行删掉,改完之后,保存,重新打开startup.bat,发现启动报错;
  3. 下载tomcat-native和OpenSSL两个软件;
  4. 解压缩tomcat-native,并且执行里面的bin目录下的openssl.exe文件,然后把生成秘钥的命令输入进去,发现第二个命令报错;
  5. 安装OpenSSL软件,并且把安装目录下的bin下的cnf里面的openssl.cnf文件拷贝到C:\Program Files (x86)\Common Files\SSL目录下;
  6. 再次打开tomcat-native下的openssl.exe文件,再次把两个秘钥命令输入进去,发现一切正常了,注意,第二个命令输入完成之后需要你填写一些信息,不用管,一路回车即可;
  7. 把生成出来的秘钥和证书文件(在openssl.exe文件同一个目录下)放入到tomcat9的conf目录下即可;
  8. 复制tomcat-native下面的bin目录下的x64下面的2个文件拷贝到jdk1.8的bin目录下,如果你是32位系统,则拷贝bin目录下的相同文件名的2个文件即可;
  9. 在tomcat9下,点击启动startup.bat,启动完成,打开浏览器,输入https://localhost:8443,测试是否正常访问;
  10. 打开IDEA,进行相关配置之后,测试是否能正常启动工程!

服务器推送

概念

指服务器预测性的提前将资源发给浏览器进行缓存,当用户访问到需要这些资源的页面时,就可以直接从缓存中读取,从而加快页面的访问速度,增加用户的体验感。

推送的步骤
  1. 设置推送资源
PushBuilder pb = request.newPushBuilder();
pb.path("1.jpg");
  1. 进行推送
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)matchValuePatternmappingMatch
“”“”“”CONTEXT_ROOT
“/index.html”“”/DEFAULT
“/MyServlet”MyServlet/MyServletEXACT
“/foo.extension”foo* .extensionEXTENSION
“/path/foo”foo/path/*PATH

提供HttpFilter

HttpFilter是Filter的子类,实现了http接口。

IBM开发者社区文章:Servlet 4.0 入门

struts2的使用

一、servlet、struts1.x和struts2.x的关系说明

共同点
➢都是用来作为MVC模型中的Control层;
➢主要功能在于交互式地浏览和修改数据,生成动态Web内容;
struts2.x的简单使用
不同点
➢struts1.x需要继承Action类,和servlet的耦合度很高, 甚至可以看成就是个servlet的封装,而struts2的就是一个javabean, 实现是基于拦截器;
➢servlet和struts1均是单实例、多线程,线程不安全,struts2本身就是多实例、 单
线程的,所以可以说本身就是线程安全的。

二、struts2.x的简单使用

Hello World Using Struts 2

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";
}

mvc+freemarker+Mybatis

项目地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值