jsp和servlet(servlet)


一、Servlet 是什么?

Servlet 是 个特殊的 Java 类,这个 Java 类必须继承 HttpServlet 。每个 Servlet 可以响应客户端的请求
Servlet 提供不同的方法用于响应客户端请求。
servelt 提供不同方法响应请求 doget dopost doput dodelete,
一般都用do get dopost 当然 可以简化 使用service方法来处理get 和post请求
httpservlet还提供init 和destroy方法
要初始化时,可以用init方法,不用构造,在方法第一行使用super.init()
要在servlet被销毁前回收资源,要用destroy方法

二、使用步骤

1.引入库

idea 编写好web结构目录,配置tomcat

2.编写servlet

public class MyServlet extends HttpServlet {
	
	public void doGet (HttpServletRequest request,HttpServletResponse response) {
		try {
			response.getWriter().println("<hr>dsfdsfds</hr>");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

3.响应客户端请求

为了让 Servlet 能响应用户请求,还必须将 Se let 配置在 Web 应用中

配置 Servlet 时,需要修改
web.xml 文件。

Servlet3开始 有两种配置方式
》在 Servi et 类中使用@WebServlet 注解进行配置。
》通过在 web.xml 文件中进行配置。

1.web.xml配置

首先在j2ee下创建目录web
接着再创建目录web/WEB-INF
然后在WEB-INF目录中创建 web.xml

web.xml模板
apache-tomcat-8.5.70-windows-x64\apache-tomcat-8.5.70\webapps\examples\WEB-INF\web.xml

web.xml提供路径与servlet的映射关系
servlet标签下有两项 是映射名 和映射类 servlet mapping是映射名和映射路径 ,映射名同servlet中一致,映射路径即为url访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
 
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

2.webServlet注解配置

1.在MyServlet上添加@WebServlet代码

@WebServlet("/myAnnotationServlet")
public class MyServlet extends HttpServlet {


2.去除web.xml配置

访问路径改为注解后的,
浏览器访问即可

3.中文问题

其实产生中文乱码的原因就是客户端和服务器所使用的编码不同。

浏览器发给服务器默认是iso-8859-1 meta数据中的Content 可设置charset 或者jsp的

page指令的 charset 当两者不一致时,以page指令的charset为准 ,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

get请求编码方式和post请求提交编码方式不同,get是把数据直接放到url中,例如以上的uname,IE浏览器先对中文进行utf-8编码(一个中文3个字符表示 太长),继而为了缩短字符又用ISO8859-1编码后传递给服务器。

而post请求则在浏览器端把数据以utf-8的形式存储到http的请求体中

2. request中文乱码

地址栏直接输入URL访问浏览器默认将参数按照utf-8进行编码;点击页面中的超链接访问和提交表单访问浏览器将参数按照当前页面的显示编码进行编码。

因为request默认以ISO8859-1进行解码的

所以服务器的doGet方法中要先进行ISO8859-1解码再utf-8解码才能看到中文

因为post不用通过url传输,继而只要 request.setCharacterEncoding(“utf-8”);通知request以utf-8形式解码就行,

解决方法如下:

  1. 不管是get请求还是post请求,将中文参数进行url编码,用URLEncoder.encode()进行编码传到后台

  2. 设置pageEncoding=“utf-8”

  3. 后台接收编码也用 utf-8

  4. web.xml设置编码

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

encodingFilter

/*

response中文乱码

服务器发给浏览器的数据默认也是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。解决方法如下:

a. 设置服务器端的编码

response.setCharacterEncoding('utf-8”);

b. 通知浏览器服务器发送的数据格式

response.setContentType('text/html;charset=utf-8”);

c. jsp页面通知浏览器展示的编码格式

只要服务端,发送端和浏览器端的编码一致就不会出现乱码,一般有中文的都用UTF-8或者GB2312编码。

当然在用Eclipse进行开发的时候,一定要优先设置jsp文件的编码,默认的不是utf-8编码,如果不修改会导致jsp文件中文乱码,修改步骤如下:

  1. Eclipse–>windows->preference->General->Content Types–>右侧的Content Type中选中 Text->JSP 将默认编码改为"utf-8"

  2. Eclipse–>windows->preference->General->Workspace-> Text file encoding 改为 “UTF-8”

4.链接数据库

@WebServlet( name="test" ,urlPatterns = {"/test"},initParams = {

        @WebInitParam(name = "driver",value = "com.myql.jdbc.Driver"),
        @WebInitParam(name = "url",value="jdbc:mysql://localhost:3306/javaee"),
        @WebInitParam(name="user",value = "root"),
        @WebInitParam(name = "pass",value = "rootroot")
})
public class MyServlet extends HttpServlet {

    @Override
    public void destroy() {
        super.destroy();
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletConfig config =getServletConfig();
         String driver=  config.getInitParameter("driver");
        super.service(req, resp);
    }
}


4.jsp/servlet生命周期

web容器控制servlet生命周期
(1)创建servelt实例
(2) web容器调用 init方法,对servlet初始化
(3) 初始化后将一直存在容器中 ,用于响应请求
(4) web容器销毁servlet时 先调用destroy方法

创建实例有两个时机
第一次请求servlet ;web应用启动立即创建

当用户通过浏览器输入一个路径,这个路径对应的servlet被调用的时候,该Servlet就会被实例化

为LoginServlet显式提供一个构造方法 LoginServlet()

然后通过浏览器访问,就可以观察到
“LoginServlet 构造方法 被调用”

无论访问了多少次LoginServlet
LoginServlet构造方法 只会执行一次,所以Servlet是单实例的


@WebServlet(loadOnStartup = 1)
public class MyServlet extends HttpServlet {

或者配置webxml

  <load-on-startup>1</load-on-startup>
</servlet>

总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值