javaWeb的前后端交互(一): servlet与js

本文中,后台使用jetty的servlet类,前台使用JS,演示servlet和JS之间的数据交互。

后台

我后台使用的jetty的servlet,纯servlet没试过。使用jetty在桌面端程序内创建服务,使其能够接收web请求。

jetty创建web服务

依赖

下面是需要使用到的依赖,前两个依赖是jetty需要用到的。当需要接收参数的类型是字符串时,只需要这些即可。如果接收参数的类型是对象时,则需要使用fastJson。本地使用fastJson接收数据,也可以换成其他的JSON工具类。

   <!-- jetty -->
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-webapp</artifactId>
      <version>9.3.7.v20160115</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlet</artifactId>
      <version>9.3.7.v20160115</version>
    </dependency>

    <!-- fastJson-->
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>

接收请求

创建一个handler来接收请求。该类继承jetty的AbstractHandler类。

public class JettyController extends AbstractHandler {
    @Override
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        
        String queryString = request.getQueryString();
       
        response.setContentType("text/html; charset=utf-8");
        request.setCharacterEncoding("utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        // 解决跨域问题
        response.setHeader("Access-Control-Allow-Origin", "*");
        baseRequest.setHandled(true);
        PrintWriter out = response.getWriter();
        if(target.equals("/favicon.ico")) {
            System.out.println("1");
            out.println("404");
        } else if (target.equals("/testGet")){
            // 这里接收一个对象类型的参数,先接受一个字符串(该字符串在前台由JSON转化)。如果参数类型为纯字符串,只要下面的第一行即可接收。
            String data = request.getParameter("data");
            Action action = JSON.parseObject(data, Action.class);
           	// 返回一个succeed字符串给前台。
            out.print("succeed");
        } else if (target.equals("/test")) {
            System.out.println("2");
            // 可以在括号内添加html字符串,实现直接返回前端界面的结果,此时在浏览器中输入http://.../test便可以显示内容
            out.print();
        }
    }
}

使用FASTJSON需要有一个相应的接收类。在上例中,使用一个Action对象接收,该对象的方法如下。

import java.util.Arrays;

public class Action {
    public String actionId;

    public String actionName;

    public String anotherName;

    public String urlTemplate;

    public String[] params;

	// get和set方法省略

    public Action(String actionId, String actionName, String anotherName, String urlTemplate, String[] params) {
        this.actionId = actionId;
        this.actionName = actionName;
        this.anotherName = anotherName;
        this.urlTemplate = urlTemplate;
        this.params = params;
    }

    @Override
    public String toString() {
        return "Action{" +
                "actionId='" + actionId + '\'' +
                ", actionName='" + actionName + '\'' +
                ", anotherName='" + anotherName + '\'' +
                ", urlTemplate='" + urlTemplate + '\'' +
                ", params=" + Arrays.toString(params) +
                '}';
    }
}

选择一个端口,来启动该服务。

public class JettyServer {
    public static void main(String[] args) throws Exception {
    	// 使用端口8084启动服务。该服务就是上文中创建的handler。之后使用localhost:8084便可以启动服务。
    	// 例如: http:://localhost:8084/test 便可以得到具体的结果。
        Server server = new Server(8084);
        server.setHandler(new JettyController());
        server.start();
        server.join();
    }
}

前端部分

	// 使用JQ的 $.post方法发送post请求。下文中的三个参数分别是对应的后台地址,参数和回调方法。
        $.post(
	        "http://localhost:8084/testGet",
	        {
	           // 使用JSON.stringify方法将JS对象转化为字符串
	        	data: JSON.stringify(this.actions[this.selectedIndex])
	        },
	      	function (data) {
	      		// 根据后台的反馈结果,进行相应的显示。在上文中,out.print()返回的结果时succeed,所以这里的判断依据也是该字符串。
				if (data == "succeed") {
					alert('提交成功')
				} else {
					alert('提交失败')
				}
	       	}
       	)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值