web核心,servlet。

 1.快速入门

 <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

@webServlet注解,就会访问这个类的servlet。

例子:

@WebServlet("/demo1")这句话的意思是,在模块里访问这个路径,

就会访问这个加了注解的servlet对象。

2.servlet执行流程

urlPatterns是路径,如果注解里只写/demo2,则可以省略。

就能访问到这个加了注解的servlet。

service方法被tomcat调用,会发回给客户端浏览器一个响应。

这里的servlet对象,是继承了Servlet ServletDemo1类的对象。

调用service,如果它自己没有重写,那就一层层往上找。

 2.1 servlet生命周期

让servlet对象在服务器加载的时候就建好,可以让之后的操作更流畅。

loadOnStartup的值越小,优先级越高。即先建它。

 

 2.1.1 init方法(初始化)

完成初始化servlet对象。这个方法一个对象只会被调用一次。

2.1.2 destroy方法

3.servlet体系(Httpservlet)

多态详解:这里加了注解。这里生成的对象是HttpServletDemo1的对象,

先调用service方法,因为它自己没有重写,所以去父类里面找父类的service方法。

然后父类的Service里,又调用了doget,这个doget子类重写了。

所以,在父类的Service方法里,doget用的是子类重写的方法。

所以就会输出 get。。。。。

 

 3.1 自己写一个HttpServlet理清它的逻辑。

因为doget,和dopost方法处理的数据不同,

一个是前端的get,数据放在请求行。

一个是前端的post,数据放在请求体。

所以需要写不同的方法进行处理。

HttpServlet的大体功能如下图myHttpServlet.java。

myHttpServlet.java

public class MyHttpServlet implements Servlet {

    /*service方法,在servlet被访问的时候自动执行*/
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("hello servlet");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

@Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //这里是强转来读取method。
        HttpServletRequest request= (HttpServletRequest) req;
        //分析一下传过来的类型。
        String method =request.getMethod();
        if(method.equals("GET"))
        {
            //get的处理逻辑
            doGet(req,res);
        }else if(method.equals("POST")){
            //post方式的处理逻辑
            doPost(req,res);

        }



    }

   protected void doPost(ServletRequest req, ServletResponse res) {

    }
    //protected定义的,然后子类可以重写。

   protected void doGet(ServletRequest req, ServletResponse res) {
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
MyHttpServletTestDemo5.java
@WebServlet("/demo5")
public class MyHttpServletTestDemo5 extends MyHttpServlet {

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
        System.out.println("get1111");
    }

    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
        System.out.println("post1111");
    }
}

 自己写的post,

3.1.1卡住的地方

1.String的equals,区分大小写。

在包里POST,是大写的。

2.浏览器控制台  ,抓包,要勾上。

4.webservlet注解(urlpattern)

这俩路径可以触发同一个servlet。

 4.1 urlpattern 匹配。

/*的优先级,高于/。

tomcat,里面web.xml,默认的servlet被/替代

 

5.XML配置方式编写Servlet。

先编写Servlet类,然后  Servlet3.0之前在web.xml整。而不是用注解。

新写一个servlet。

 

 在web.xml里

给name配个路径。

 

 用注解直接写 /demo13即可。

6.Request和Response

tomcat给请求的信息,装进request对象里。

抓取get方法里的数据

 6.1解决了一个乱码问题,

IDEA设为UTF-8,GBK部分reload成GBK。

6.2 request体系

request对象实际是由RequestFacade类声明的,它是实现了HttpServletRequest。

tomcat解析数据,用RequestFacade类,来解析数据进request。

 

 6.3 request获取请求数据。

1.请求行的获取

 

试验:

 

 

 

 

2.请求体获取

3.请求体

比如上传文件,上传图片。

 

写个例子。密码都是字符串,在post里获取。

 

 

 

 

6.4 通用方式获取请求参数

之前的两个方法请求参数,没必要。

直接用这个。

getparameterValues,获取的这个键里,可能对应的两个值,放进数组。

 

request对象早已经把字符串数据拆开放进map里。 

 

6.4.1 操作方式。

doget和dopost,两个方法只需要写其中一个,在另一个方法里写

this.doGet(req,res)或this.doPost(req,res)。即可。

 

快速建立servlet。选create new servlet。然后改写它的模板。

 然后settings--》Editor-->File and Code Templates,选other。

other里的web下,选

 进去编辑模板。

6.5 请求参数,乱码解决

我的控制台不会乱码。因为IDEA里面改了UTF-8.

6.5.1 Post的解决方式。

post里走的是字符流。

用的是getReader处理。

6.5.2 Get的解决方式。

get的没办法用setCharacterEncodin(UTF-8);  来解决。

用的是getQuerytostring处理。

先把这些字符串,按照tomact规定给解码成字节数组。

然后把这些字节,按UTF-8的规则,编程字符串,解决!

 

乱码原因:两边编码解码意见不统一。但tomcat8已经解决了这个问题。

 

 7.request请求转发

 

跳转到B路径。

 

 

demo5里写。

 demo6里写

 控制台接收到了

 

但是当我键是中文的时候,打印的却是null。

所以,键不能写成中文。

转发是servlet之间的转发。request对象里共享数据。

 

8.response

 8.1 介绍

 

 

8.2 response完成重定向

 

这样写太笨,建议下图这样写。

 

重定向,地址栏发生了变化。

 

访问本站点里的其它路径    就以 / 开头,外网路径就以 http:// 开头。

 

 这样就能跳到百度。

8.3 response响应字符数据。

1.往流里面写字符。

 设成utf-8。

 

 

 

8.4 response响应字节数据。

 8.4.1复制流数据。(传图片)

先导入一个复制流的依赖。

<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

 

 

 

9.虚拟目录什么时候加

虚拟目录即项目的名称。

如果是浏览器处理这个路径,就要加虚拟目录。

如果是服务器内部之间的,就不需要加。

 

 9.1 动态配置虚拟目录。

 

 

10. 做案列

修改提交路径。

 

10.1用户登录重要代码

 Login.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link href="css/login.css" rel="stylesheet">
</head>

<body>
<div id="loginDiv">
    <form action="/mavenweb/loginServlet" method="post" id="form">
        <h1 id="loginMsg">LOGIN IN</h1>
        <p>Username:<input id="username" name="username" type="text"></p>

        <p>Password:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>

</body>
</html>

 LoginServlet

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //接收用户名和密码。
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        System.out.println(username);

        /*调用mabatis*/
        //1.加载mybatis的核心配置文件,获取sqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession=sqlSessionFactory.openSession(true);



        //3.执行sql
        /*List<User> users = sqlSession.selectList("test.selectAll");
        //这里只需要xml里,传入sql语句的唯一标识和名称空间*/

        //3.1 获取UserMapper的代理对象。
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //反射。
        User user=userMapper.select(username,password);

        sqlSession.close();


        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //判断user是否为null


        if(user != null)
        {
            writer.write("登录成功");
            System.out.println(1);

        }else
        {
            writer.write("登录失败");
            System.out.println(2);
        }

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

10.2 用户注册重要代码

 

 卡住的地方,这俩SQL语句自己写没写对。

 

提交事务,这里。有变化,新增的话。

 

 registerLoginServlet

@WebServlet("/registerServlet")
public class registerServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String username= request.getParameter("username");
        String password = request.getParameter("password");
        User user2=new User();
        user2.setUsername(username);
        user2.setPassword(password);

        /*调用mabatis*/
        //1.加载mybatis的核心配置文件,获取sqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession=sqlSessionFactory.openSession(true);



        //3.执行sql
        /*List<User> users = sqlSession.selectList("test.selectAll");
        //这里只需要xml里,传入sql语句的唯一标识和名称空间*/

        //3.1 获取UserMapper的代理对象。
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //反射。
        User user=userMapper.selectByName(username);

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();

        if(user ==null)
        {
            userMapper.add(user2);
            sqlSession.commit();
            sqlSession.close();
            writer.write("bingo");

        }else
        {

            writer.write("cunzai");

        }




    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

11.创建SqlSessionFactory 代码可以优化

1.我们一个Servlet里面写了个 SqlSessionFactory对象,代码重复太高。

2.我们SqlSessionFactory创建的对象太多,资源消耗太大。

 写个工具类。

这句话不能放在工具类。这句话造了个连接。

所有用户都用一个连接,产生影响很大。

 

 SqlSessionFactoryUtils

public class SqlSessionFactoryUtils {


    private  static SqlSessionFactory sqlSessionFactory;

    //静态代码块随着类的记载执行。只会执行一次。
    static {

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }

}

然后去改造mybatis调用那里。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值