在GET请求中应用正则表达式过滤器使用Java代码,而不是SQL



我有一个目标——从数据库中获得过滤后的联系人使用Java,但不使用SQL。两个问题:

  1. 用于数据库的重Java代码
  2. IllegalArgumentException:在请求目标中发现无效字符。有效字符在RFC 7230和RFC 3986中定义,因为我需要使用^、[、]和other等符号。

我不能在SQL中使用regex,只能在Java中使用。

解决这些问题的最佳方法是什么?我的代码。

public class Contact {
private int id;
private String name;
public Contact() {
}
public Contact(ResultSet resultSet) throws SQLException {
setId(resultSet.getInt(1));
setName(resultSet.getString(2));
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Contact [Id=" + id + ", Name=" + name + "]";
}
} 
public class ManagementLayer {
private static final Logger LOG = Logger.getLogger(String.valueOf(ManagementLayer.class));
private ManagementLayer() {
}
private static class ManagementHolder{
static final ManagementLayer Instance = new ManagementLayer();
}
public static synchronized ManagementLayer getInstance() {
return ManagementHolder.Instance;
}
public List<Contact> getFilteredContacts(String regex, Connection dbConnection)
throws SQLException, PatternSyntaxException {
Pattern pattern = Pattern.compile(regex);
List<Contact> contacts = new ArrayList<>();
Statement statement = null;
ResultSet resultSet = null;
if (dbConnection == null) {
try {
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/hello");
dbConnection = dataSource.getConnection();
} catch (NamingException e) {
LOG.info(e.getMessage());
}
}
try {
if (dbConnection != null) {
statement = dbConnection.createStatement();
statement.setFetchSize(1);
resultSet = statement.executeQuery("SELECT * FROM contacts");
while (resultSet.next()) {
String contactNameString = resultSet.getString(2);
Matcher matcher = pattern.matcher(contactNameString);
if (!matcher.matches()) {
Contact contact = new Contact();
contact.setId(resultSet.getInt(1));
contact.setName(contactNameString);
contacts.add(contact);
}
}
}
System.out.println(contacts.toString());
} finally {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
}
return contacts;
}
}

@Path("contacts")
public class WebServiceLayer {
private static final Logger LOG = Logger.getLogger(String.valueOf(WebServiceLayer.class));
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Contact> getNameFilter(@QueryParam("nameFilter") String val) {
if (val == null || val.isEmpty()) {
throw new WebApplicationException(Response
.status(HttpURLConnection.HTTP_BAD_REQUEST)
.entity("Error! Parameter is wrong or empty!")
.build());
} else {
List<Contact> contacts = new ArrayList<>();
try {
contacts = ManagementLayer
.getInstance()
.getFilteredContacts(val, null);
} catch (SQLException e) {
LOG.info(e.getMessage());
}
return contacts;
}
}
}
  1. 我使用ConcurrentHashMap从数据库创建缓存
  2. 在Tomcat server.xml文件中添加了配置(port="8080"protocol="HTTP/1.1"URIEncoding="UTF-8"connectionTimeout="20000"redirectPort="8443"relatedQueryChars='^{}[]|$*'(。在servlet中还添加了URLCode.decode(val(,用于解决正则表达式中正确转换编码符号的问题

最新更新