JavaWeb-Servlet接口

it2022-05-05  216

Servlet

Servlet简介

servlet是sun公司提供的一门用于开发动态web资源的技术

sun公司在其API中提供了一个servlet接口,用户若想用一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下两个步骤:

1.编写一个java类,实现servlet接口

2.把开发好的java类部署到web服务器中

按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序称为Servlet。

Servlet的运行过程

Servlet实现类

Servlet接口sun公司定义了两个默认实现类,分别为:GenericServlet、HttpServletHttpServlet指能够处理HTTP请求的servlet,他在原有Servlet接口中添加了一些HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常继承这个类,而避免直接去实现Servlet接口HttpServlet在实现Servlet接口时,覆写了servlet方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求时,则调用HttpServlet的doGet方法,如为Post请求时,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet方法或doPost方法,而不要去覆写servlet方法

使用IDEA开发Servlet

Servlet访问URL映射配置

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用< servle >元素和< servlet-mapping>元素完成。   < servlet>元素用于注册Servlet,它包含有两个主要的子元素:< servlet-name>和< servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。 一个< servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:< servlet-name>和< url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:

<servlet> 2 <servlet-name>ServletDemo1</servlet-name> 3 <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class> 4 </servlet> 5 6 <servlet-mapping> 7 <servlet-name>ServletDemo1</servlet-name> 8 <url-pattern>/servlet/ServletDemo1</url-pattern> 9 </servlet-mapping>

同一个Servlet可以被映射到多个URL上,即多个< servlet-mapping>元素的< servlet-name>子元素的设置值可以是同一个Servlet的注册名。

Servlet映射路径问题

在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾。例如:

servlet> 2 <servlet-name>ServletDemo1</servlet-name> 3 <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class> 4 </servlet> 5 6 <servlet-mapping> 7 <servlet-name>ServletDemo1</servlet-name> 8 <url-pattern>/*</url-pattern>

*可以匹配任意的字符,所以此时可以用任意的URL去访问ServletDemo1这个Servlet

对于如下的一些映射关系:   Servlet1 映射到 /abc/*   Servlet2 映射到 /*   Servlet3 映射到 /abc   Servlet4 映射到 .do 问题:   当请求URL为“/abc/a.html”,“/abc/”和“/”都匹配,哪个servlet响应   Servlet引擎将调用Servlet1。   当请求URL为“/abc”时,“/abc/”和“/abc”都匹配,哪个servlet响应   Servlet引擎将调用Servlet3。   当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应   Servlet引擎将调用Servlet1。   当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应   Servlet引擎将调用Servlet2。   当请求URL为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,哪个servlet响应   Servlet引擎将调用Servlet2。   匹配的原则就是"谁长得更像就找谁"

重定向

将这个请求,转换到另一个地址;

比如,我们请求 : http://localhost:8080/servlet01/dasdasdasda/aaaa.do 他会跳转到百度首页;

//通过响应对象重定向页面 resp.sendRedirect("404.jsp");

ServletContext

WEB容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用多个Servlet通过ServletContext对象实现数据共享获取web应用的初始化参数用ServletContext实现请求转发利用ServletContext对象读取资源

通过servletContext对象实现数据共享

通过this获得ServletContext,实现数据的共享

通过servletContext对象读取网站配置文件

新建一个properties文件 driver=com.mysql.jdbc.Driver username=root password=123456 url=jdbc:mysql://localhost:3306/smbms

2.编写servlet类

//读取properties配置文件 public class ServletDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //读取配置文件 //1.获得配置文件的路径 String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties"); System.out.println("取得的路径为:"+realPath); Properties properties = new Properties(); FileInputStream is = new FileInputStream(realPath); properties.load(is);//把文件流加载到配置文件的对象中; String driver = properties.getProperty("driver"); String username = properties.getProperty("username"); String password = properties.getProperty("password"); String url = properties.getProperty("url"); //响应到网页 resp.getWriter().println(driver); resp.getWriter().println(username); resp.getWriter().println(password); resp.getWriter().println(url); //======================================= System.out.println(driver); System.out.println(username); System.out.println(password); System.out.println(url); } }

3.配置web.xml

<servlet> <servlet-name>Demo03</servlet-name> <servlet-class>com.kuang.servlet.ServletDemo03</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo03</servlet-name> <url-pattern>/q3</url-pattern> </servlet-mapping>

4.访问查看

localhost:8080/demo02/q3

5.项目结构

简单验证码

//验证码 public class ServletDemo04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //resp.getWriter().println(newRandom()); //自动刷新网页 resp.setHeader("refresh","2"); //验证码是一个图片 , 我们需要制作一个图片 BufferedImage image = new BufferedImage(100,30,BufferedImage.TYPE_3BYTE_BGR); //图片写入一些东西 Graphics2D graphics = image.createGraphics(); graphics.setColor(Color.red); String num = String.valueOf(newRandom()); graphics.drawString(num,10,10); //想办法让浏览器知道我们给的是一张图片 resp.setContentType("image/jpg"); //让网站去打开图片 ImageIO.write(image,"jpg",resp.getOutputStream()); } //生成随机数 public int newRandom(){ int num = (int)(Math.random()*9+1)*100000; return num; } /* @Test public void test(){ ServletDemo04 servletDemo04 = new ServletDemo04(); for (int j = 0; j < 100; j++) { int i = servletDemo04.newRandom(); System.out.println(i); } } */ } void test(){ ServletDemo04 servletDemo04 = new ServletDemo04(); for (int j = 0; j < 100; j++) { int i = servletDemo04.newRandom(); System.out.println(i); } } */ }

最新回复(0)