Restlet2.0学习——简单WebApp多Application与表单提交

7 篇文章 0 订阅
之前我们提到过简单的WebApp实现,使用的是一个application,而这一次,就是在web.xml中放入多个application。其实这里的application就是一个servlet,只是这些servlet下调用的各种resource是线程安全的。有兴趣的同学可以对resource进行多线程访问测试。
这次我们项目名仍然使用RestLetServlet。其他的jar也同webapp,保持不变。
多application的web.xml配置如下:
 <servlet>  
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>com.restlet.application.HelloApplication</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>com.restlet.application.UserApplication</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/users/*</url-pattern>
</servlet-mapping>

这样,就可以通过访问不同的路径分别访问到HelloApplication和UserApplication的应用。

对于其application内部的编写如下:
public class HelloApplication extends Application {

@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("/getHello", HelloResource.class);
return router;
}
}

public class UserApplication extends Application {
@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("", UsersResource.class);
router.attach("/{userId}", UserResource.class);
return router;
}
}

这里的UserApplication用了两个resource,一个是Users资源,另一个是User资源。从ROA的设计角度看。Users资源中get方法是获取用户列表,post方法是添加一个用户。而User资源中的get是获取某个用户的信息,put方法是修改某用户信息,delete方法是删除某用户信息。
这里只是做简单的添加用户和获取用户信息,put和delete在这里就不加了。
public class UserResource extends ServerResource {

private Logger logger = Logger.getLogger(this.getClass());
@Get
public String getUser() {
String userId = (String)getRequest().getAttributes().get("userId");
logger.debug("this is getUser");
return "this is getUser"+userId;
}

}

public class UsersResource extends ServerResource {

private Logger logger = Logger.getLogger(this.getClass());
@Post
public Representation addUser(Representation entity) {
Form form = new Form(entity);
String username = form.getFirstValue("username");
String password = form.getFirstValue("password");
logger.debug("username="+username+"\t password="+password);
return null;
}

@Get
public String getUsers() {
logger.debug("this is getUsers");
return "this is getUsers";
}
}

最后我们只要加上一个访问路口的表单就可以了。这个表单我们就放在index.jsp下
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>user form</title>
</head>
<body>
<form action="users" method="post">
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>

我们来看一下路径。从http://localhost:8080/RestLetServlet/
就直接访问到index.jsp了。
而index.jsp下的表单action指向的路径为http://localhost:8080/RestLetServlet/users
就是会调用UsersResrource资源的post方法,因为这里我们设定的method是post。(不过很可惜method只能设定get和post,如果有put的话,就可以调用put方法进行修改了。解决的办法就是把put当做form的一个参数传递给UsersResource资源,并通过代码来模拟调用put方法),把数据传递给该资源,进行信息打印。
在浏览器中,我们直接输入http://localhost:8080/RestLetServlet/hello/getHello就可以访问到HelloApplication下的HelloResource。两个application在路径上相互不受影响。HelloResource类在简单webapp实现一文中已经贴出,这里就不重复贴出了。
在浏览器中,我们直接输入http://localhost:8080/RestLetServlet/users/123的话,就会访问UserResource资源,并调用get方法。打印相关信息。如果是和数据库交互的话,123应该就是某一个userId,然后去获取user的具体信息并返回给前端。
在浏览器中,我们直接输入http://localhost:8080/RestLetServlet/users的话,是直接调用UsersResource的get方法,logger中输出信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值