侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

serverLet

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 103 阅读 / 7,666 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
用java语言编写的动态语言开发技术
解决返回乱码
resp.setContentType("text/html;charset=UTF-8");

getAttribute(String name)

传的参数为空的话,req.getParamter()得到的是‘’空的字符串,若果没有参数的名字是null

<form action="${pageContext.request.contextPath}/register" method="post">

如果找不到javax包就把Tomcat文件夹里的lib添加到全局项目Liberty
配置麻烦。 在运行设置里配置tomcat的启动

jdbc:mysql://localhost:3306/testuse?Unicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8
实现
1.
要写一个继承serverlet接口的类,但一般只写继承自httpServerLet的子类就行
2.
重写 doGet() doPost() 等方法
在 context里是全局区,可以设置、读取属性。
3.
最后配置web.xml 来使url能访问到写的serverlet。
要用垃圾的xml配置。

<url-pattern>这里可以写a.* 和 *.a </url-pattern>

Servlet3.0以上可以使用注解@WebServlet自动映射,不用在web.xml中配置<servlet>和<servlet-mapping>
@WebServlet("/FirstServlet2")
修改服务器端口号
动态资源静态化 数据不怎么更改但是访问量大的动态页面要静态化来减少数据库压力

Servlet:是一个接口
servlet 是运行在 Web 服务器中的小型 Java 程序。
servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求
实现子类:
GenericServlet
HttpServlet
第一个Servlet程序开发
1.
实现接口
public class UserService extends HttpServlet{
		@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp){}
		@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
				System.out.println("This is Servlet!");
				resp.getWriter().write("This is Servlet!");
		}
		@Override
    protected void doServer(HttpServletRequest req, HttpServletResponse resp){}
}
2.
配置Servlet信息和访问路径
<servlet> 
	<servlet-name>myS</servlet-name> 
	<servlet-class>myS</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>myS</servlet-name>
<url-pattern>/myS</url-pattern>
</servlet-mapping>




servlet配置

完全路径匹配(servlet)
以/开头 配置文件怎么写,怎么访问 /demo1
目录匹配(过滤器)
以/开头,以*结尾 /a/*
扩展名匹配(struts2框架)
*.do *.action 不能以/开头
ServletConfig(配置对象)
Servlet运行原理
servlet容器 加载的servlet类的放置地点,同时,webserver也会把请求往这里发
servlet容器是包含在web容器(服务器)里的。

伪代码演示servlet的生命周期
Tomtcat内部代码运行:
1、通过URL映射找到到servlet-class的内容(zzuli.edu.cn.FirstServlet)
2、通过反射构造FirstServlet对象
2.1 得到字节码对象
Class clazz = class.forName("zzuli.edu.cn.FirstServlet");
2.2 调用无参数的构造方法来构造对象
Object obj = clazz.newInstance(); ---1.servlet的构造方法被调用
3、创建ServletConfig对象,通过反射调用init方法
3.1 得到方法对象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2 调用方法
m.invoke(obj,config); --2.servlet的init方法被调用
4、创建request,response对象,通过反射调用service方法
4.1 得到方法对象
Methodm m=clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServlet Response.class);
4.2 调用方法
m.invoke(obj,request,response); --3.servlet的service方法被调用
5、当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
5.1 得到方法对象
Method m = clazz.getDeclareMethod("destroy",null);
5.2 调用方法
m.invoke(obj,null); --4.servlet的destroy方法被调用
Servlet的生命周期
构造
创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象。只调用1次,证明servlet对象在tomcat是单实例的
init()
servlet在第一次请求的时候,创建SERVLET,调用init方法完成初始化。
tomcat创建的。
servlet是单例(单个实例)多线程的
service()
一次请求,调用一次

destory()
关闭服务器的时候,销毁Servlet,该方法调用一次


Servlet的多线程并发问题(重点)
注意: servlet对象在tomcat服务器中是单实例多线程的。
因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。
解决线程不安全问题办法:
1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)
2)在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步,而且尽量缩小同步代码块的范围(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。
3)只要在servlet类中不使用共享数据,就不影响servlet的正常使用。
原文链接:https://blog.csdn.net/Mr_wxc/article/details/102730312
ServletContext
在web服务器启动后,为每一个应用创建一个ServletContext对象。
生命周期长,作用范围广
使用该对象完成在不同资源之间的数据传输
如何获取该对象
1. config.getServletContext()
2. 在HttpServlet中getServletContext();(常用)
作用:
1. 获取全局化参数
2. 域对象代表的就是整个应用
域对象:在不同的范围之间传递数据
page---request---session---application(JSP中的写法)
void setAttribute(String name, Object object) :向域对象中存入属性和值
Object getAttribute(String name) :从域对象中获取属性的值
void removeAttribute(String name) :从域对象中删除属性
(记录页面访问次数 欢迎你,你是第n个客户)
3. 读取资源文件
servletRequest
servletRequest.getLocalAddr() = 0:0:0:0:0:0:0:1 servletRequest.getServerName() = localhost servletRequest.getLocalName() = 0:0:0:0:0:0:0:1 servletRequest.getProtocol() = HTTP/1.1 servletRequest.getRemoteAddr() = 0:0:0:0:0:0:0:1 servletRequest.getRemoteHost() = 0:0:0:0:0:0:0:1 servletRequest.getScheme() = http

HttpServletRequest request = (HttpServletRequest)servletRequest;
request
Response
是一个接口
定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法
子接口:HttpServletResponse
常用方法:
ServletOutputStream getOutputStream() 这个输出中文默认使用iso编码
PrintWriter getWriter() 用这个不乱码
中文乱码
设置resp缓冲区编码 字符串---字节编码
设置浏览器打开文件的编码 字节-----字符
void setCharacterEncoding(String charset) :设置resp缓冲区编码
void setContentType(String type)设置浏览器打开文件的编码
void setHeader(String name, String value)
void sendRedirect(String location)
void setStatus(int sc)
ServletRequest(客户端---->服务器)
是一个接口
定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法
HttpServletRequest:子接口
域对象(一次请求)
三个方法(set,get,remove)
public String getParameter(String name)
以 String 形式返回请求参数的值,如果该参数不存在,则返回 null
public String[] getParameterValues(String name):复选框
返回包含给定请求参数拥有的所有值的 String 对象数组
public void setCharacterEncoding(String env) 设置此请求正文中使用的字符编码的名称
public String getHeader(String name):以 String 的形式返回指定请求头的值
public Cookie[] getCookies():返回包含客户端随此请求一起发送的所有 Cookie 对象的数组
public HttpSession getSession():返回与此请求关联的当前会话,


resp.setHeader("refresh", "5;url=/day01/index.html");


网页路径
网页路径是在tomcat里设置的URL,例如:http://localhost:8080/bbs_web/ 之后jsp可以直接访问,servlet要在web.xml里配置过后在访问配置的名称。例:
		<servlet>
        <servlet-name>reply</servlet-name>
        <servlet-class>com.ljj.service.impl.ReplyService</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>reply</servlet-name>
        <url-pattern>/reply</url-pattern> 
    </servlet-mapping>
配置完之后ReplyService的访问路径就是http://localhost:8080/bbs_web/reply

项目路径
//File file = new File("./src/db.properties");
    /*String path = getServletContext().getRealPath(&quot;/WEB-INF/classes/db.properties&quot;);
    
    System.out.println(path);
    
    
    File file = new File(path);
    
    
    FileInputStream fis = new FileInputStream(file);*/
    
    //InputStream is = getServletContext().getResourceAsStream(&quot;/WEB-INF/classes/db.properties&quot;);
    
    InputStream is = Demo3Servlet.class.getClassLoader().getResourceAsStream(&quot;db.properties&quot;);
    
    Properties ps = new Properties();
    
    ps.load(is);
    
    
    System.out.println(ps);</code></pre></div>            <div style="width:100%;max-width:996px;margin-top:2em;margin-bottom:4px;">
            <div style="display:flex;width:100%;font-weight:600;font-size:1.875em;line-height:1.3;color:inherit;">
                <div data-root="true" style="max-width:100%;width:100%;white-space:unset;word-break:break-word;padding:3px 2px;">

InitParameter

初始化的参数
在 web.xml 里设置如下
<context-param> <param-name>name</param-name> <param-value>value</param-value></context-param>
读取
pageContext.getServletContext().getInitParameter("config")
servletContext.getInitParameter("config")
记录访问次数
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class myS extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int count = 0;
ServletContext servletContext = req.getServletContext();
count = (int) servletContext.getAttribute("count");
resp.getOutputStream().write(("已被访问" + count + "次 "+req.getQueryString()).getBytes());

}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = req.getServletContext();
    if (servletContext.getAttribute(&quot;count&quot;) == null)
        servletContext.setAttribute(&quot;count&quot;, 0);
    else
        servletContext.setAttribute(&quot;count&quot;, (int) servletContext.getAttribute(&quot;count&quot;) + 1);

    super.service(req, resp);
}

}





0

评论区