学习笔记:servlet

第一个简单的servlet

----web.xml----

<?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>a1</servlet-name>
        <servlet-class>cloud.windinfo.ServletTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>a1</servlet-name>
        <url-pattern>/mytest</url-pattern>
    </servlet-mapping>
</web-app>

 ----myweb.html----

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>myhtml</title>
</head>
<body>
    <h1>这是我的html</h1>
    <a href="mytest">test</a>
    <form action="mytest" method="post" >
        <input type="submit" value="posttest">
    </form>
</body>
</html>

 ----ServletTest.java----

package cloud.windinfo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author: WindInForest
 * @Description:
 * @Date Created in 2021-09-11 23:06
 * @Modified By:
 */
public class ServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是GET");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是POST");
    }
}

 

servlet生命周期:

(1)实例化 --先创建servlet实例        //第一次请求进行实例化和初始化
(2)初始化 --init()
(3)处理请求 ---service()        //以后每次请求直接处理,不进行实例化和初始化
(4)服务终⽌ --destory()        //直到服务器关闭执行destory()

 

处理请求 

HttpServletRequest 接口

HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接⼝)
常⽤⽅法:
1)String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String
注:服务器在接收数据时使⽤字符串统⼀接收
2)String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
3)void setCharacterEncoding(String charset) 指定每个请求的编码(针对post请求才起作⽤)
4)RequestDispatcher getRequestDispatcher(String path) --跳转⻚⾯
返回⼀个RequestDispatcher对象,该对象的forward( )⽅法⽤于转发请求
​​​​​​​5)存值 request.setAttribute("key",value);
6)取值 request.getAttribute("key");//取值后需要向下转型  
示例: String a1=(String)request.getAttribute("uname")

 

客户端如何发送数据给服务器
⽅式1:通过表单 get/post提交
⽅式2:通过a标签发送数据(get提交) <a href="请求名?key=value&key=value&key=value...">
⽅式3:通过地址栏直接拼接-get请求
⽅式4:js提交数据-get请求 location.href="⽬标请求?key=value&key=value"
:⽅式2/3都属于get提交⽅式,表单提交可以使⽤getpost提交⽅式
补充2:处理请求乱码的问题
⽅式1setCharacterEncoding("UTF-8");//post提交时管⽤
注意:tomcat8.0以后不需要⼿动设置get的编码
补充3:getpost的区别
1、GET请求的数据会暴露在地址栏中,⽽POST请求则不会。
2、在使⽤GET请求时,传输数据会受到URL⻓度的限制。 对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数 据⼤⼩进⾏限制,ApacheIIS都有各⾃的配置。
3、POST的安全性⽐GET的⾼。除此之外,GET请求提交的数据还可能会造成Cross-site request
frogery攻击

 getParameter和getAttribute区别 

 两者区别: 
①getParameter()获取的是客户端设置的数据。 
getAttribute()获取的是服务器设置的数据。 
②getParameter()永远返回字符串 
getAttribute()返回值是任意类型

既然parameter和attribute都是传递参数,为什么不直接使用parameter呢? 
①服务器端不能通过setParameter(key, value)来添加参数,因为没有这个函数 
所以如果需要在服务器端进行跳转,并需要想下个页面发送新的参数时,则没法实现。但是Attribute可以,可以通过setAttribute(),将值放入到request对象,然后在其他页面使用getAttribute获取对应的值,这样就达到一次请求可以在多个页面共享一些对象信息 
②parameter返回值是字符串,意味着不能传递其他的对象,如Map,List,但是attribute则可以存放任意类型的Java对象
 

 HttpServletRespones接口

void addCookie(Cookie var1);//给这个响应添加⼀个cookie
void sendRedirect(String var1) ;//发送⼀条响应码,将浏览器跳转到指定的位置
PrintWriter getWriter() 获得字符流
setContentType() 设置响应内容的类型
重定向:response.sendRedirect()
转发:request.getRequestDispatcher("../success.jsp").forward(request,response)
不同点:
a.重定向时地址栏会改变,request中存储的数据会丢失.转发时地址栏显示的是请求⻚⾯的地
,request数据可以保存。
b.转发属于⼀次请求⼀次响应,重定向属于两次请求(地址栏修改了两次)两次响应。
补充:使⽤out对象往⻚⾯中输出jshtml,css
:使⽤js跳转⻚⾯,也会丢失request中的数据

 

 会话 session 

void setAttribute(String key,Object value) key/value的形式保存对象值,将数据存储在服务器端
Object getAttribute(String key) 通过key获取对象值
void invalidate() 设置session对象失效
String getId()  获取sessionid,当第⼀次登录成功后,session会产⽣⼀个 唯⼀的id
void setMaxInactiveInterval(int interval)  设定session的⾮活动时间
int getMaxInactiveInterval() 获取session的有效⾮活动时间(以秒为单位),默认的有效时间:30
分钟
void removeAttribute(String key)  从session中删除指定名称(key)所对应的对象

 

 获得初始化参数

(1)web.xml中先定义初始化参数

局部初始化参数:

 <servlet>
     <servlet-name></servlet-name>
     <servlet-class></servlet-class>
     <init-param>
         <param-name>encoding</param-name>
         <param-value>utf-8</param-value>
     </init-param>
</servlet>

全局初始化参数: 

<context-param>
    <param-name>bianma</param-name>
    <param-value>utf-8</param-value>
</context-param>

​​​​​​​(2)servlet中获得初始化参数,重写init()⽅法

encoding= config.getInitParameter("encoding");        //局部

bianhao=config.getServletContext().getInitParameter("bianma");        //全局

通过注解方式获取初始化参数:

@WebServlet(name = "myUserServlet",
     urlPatterns = "/user/test", //斜杠必须
     loadOnStartup = 1, 
     initParams = {
         @WebInitParam(name="name", value="⼩明"),
         @WebInitParam(name="pwd", value="123456")
     }
)

 

​​​​​​​

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值